异常处理(四、MFC异常处理)

MFC异常处理 MFC将对异常的处理封装到了异常类–CException类及其子类中。 阅读详情

MFC中异常处理的语法和语义构建在标准C++异常处理语法和语义的基础之上,其解决方案为:

  MFC异常处理 = MFC 异常处理类 + 宏

1 宏

  MFC定义了TRY、CATCH(及AND_CATCH、END_CATCH)和THROW(及THROW_LAST)等用于异常处理的宏,其本质上也是标准C++的try、catch和throw的进一步强化,由这些宏的定义可知:
CODE: 
--------------------------------------------------------------------------------

#ifndef _AFX_OLD_EXCEPTIONS

#define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try {

#define CATCH(class, e) } catch (class* e) /
{ ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); /
_afxExceptionLink.m_pException = e;

#define AND_CATCH(class, e) } catch (class* e) /
{ ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); /
_afxExceptionLink.m_pException = e;

#define END_CATCH } }

#define THROW(e) throw e
#define THROW_LAST() (AfxThrowLastCleanup(), throw)

// Advanced macros for smaller code
#define CATCH_ALL(e) } catch (CException* e) /
{ { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); /
_afxExceptionLink.m_pException = e;

#define AND_CATCH_ALL(e) } catch (CException* e) /
{ { ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); /
_afxExceptionLink.m_pException = e;

#define END_CATCH_ALL } } }

#define END_TRY } catch (CException* e) /
{ ASSERT(e->IsKindOf(RUNTIME_CLASS(CException))); /
_afxExceptionLink.m_pException = e; } }
  这些宏在使用语法上,有如下特点:

  (1)用TRY 块包含可能产生异常的代码;

  (2)用CATCH块检测并处理异常。要注意的是,CATCH块捕获到的不是异常对象,而是指向异常对象的指针。此外,MFC靠动态类型来辨别异常对象;

  (3)可以在一个TRY 块上捆绑多个异常处理捕获块,第一次捕获使用宏CATCH,以后的使用AND_CATCH,而END_CATCH则用来结束异常捕获队列;

  (4)在异常处理程序内部,可以用THROW_LAST 再次抛出最近一次捕获的异常。

2 MFC 异常处理类

MFC较好地将异常封装到CException类及其派生类中,自成体系,下表给出了MFC 提供的预定义异常:

异常类  含义
CMemoryException  内存不足
CFileException 文件异常
CArchiveException  存档/序列化异常
CNotSupportedException  响应对不支持服务的请求
CResourceException Windows 资源分配异常
CDaoException 数据库异常(DAO 类)
CDBException  数据库异常(ODBC 类)
COleException OLE 异常
COleDispatchException  调度(自动化)异常
CUserException  用消息框警告用户然后引发一般 CException 的异常

  标准C++的异常处理可以处理任意类型的异常,而MFC 宏则只能处理CException 的派生类型,下面我们看一个CFileException的使用例子:
CODE: 
--------------------------------------------------------------------------------

#include <iostream.h>
#include "afxwin.h"

int main()
{
 TRY
 {
  CFile f( "d://1.txt", CFile::modeWrite );
 }
 CATCH( CFileException, e )
 {
  if( e->m_cause == CFileException::fileNotFound )
   cout << "ERROR: File not found/n" << endl;
 }
 END_CATCH
}
  在这个程序中,如果D盘根目录下不存在"1.TXT"这个文件,将抛出CFileException异常,而且错误原因成员变量m_cause被设置为fileNotFound,我们以CATCH( CFileException, e )就可以捕获到。错误原因被定义为CFileException中的枚举(enum),如下:
CODE:
--------------------------------------------------------------------------------

enum {
 none,
 generic,
 fileNotFound,
 badPath,
 tooManyOpenFiles,
 accessDenied,
 invalidFile,
 removeCurrentDir,
 directoryFull,
 badSeek,
 hardIO,
 sharingViolation,
 lockViolation,
 diskFull,
 endOfFile
};
  我们在使用MFC相关类时,MFC会自动抛出异常,当然我们也可以自行在程序中利用AfxThrowXXXException()抛出各种类型的异常,其中的XXX与前文的MFC异常类表对应。我们看AfxThrowFileException的例子:
CODE: 
--------------------------------------------------------------------------------

#include <iostream.h>
#include "afxwin.h"

int main()
{
 TRY
 {
  AfxThrowFileException(CFileException::fileNotFound);
 }
 CATCH( CFileException, e )
 {
  if( e->m_cause == CFileException::fileNotFound )
   cout << "ERROR: File not found/n" << endl;
 }
 END_CATCH
}
  在此程序中,我们在TRY块自行利用MFC提供的全局函数AfxThrowFileException抛出了CFileException异常,其后在CATCH块抓住了这个异常。

  MFC建议不再使用TRY、CATCH和THROW宏,而是直接使用标准C++的方式。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/gabazi/archive/2005/11/17/531965.aspx

c/vc++/MFC异常处理/结构化异常处理 浅析 c/vc++/结构化异常处理 浅析 C语言异常处理 C++语言异常处理 异常处理函数 MFC异常处理 结构化异常处理 立即下载

相关推荐

OpenVPN 新增 windows 客户端

虚拟私人网络(Virtual Private Network,简称VPN)是一种网络技术,它允许用户通过公共网络(如互联网)建立一个安全的连接通道。本文介绍如何添加 windows 客户端。

利昂的技术存档 3769

MFC中的定时器不能正常触发

现象是SetTimer(1,3000,NULL);之后并没有进入OnTimer函数 1.程序确定没有在其他地方一直执行循环 2.确定程序没有提前使用KillTimer 3.确认程序等了3秒之后,确实没有进入OnTimer函数 4.OnTimer函数除了需要定义 afx_msg void OnTimer(UINT_PTR nIDEvent); 还需要添加消息函数ON_WM_TIMER()如下: BE...

jbh_sunshine的博客 2766

Windows电脑如何用MobaXterm连接宇树G1机器人?保姆级SSH配置指南

本文提供了一份详细的保姆级教程,指导Windows用户使用MobaXterm通过SSH连接宇树G1机器人。内容涵盖从物理网络配置、MobaXterm安装与SSH会话创建,到文件传输、X11转发等高级功能,并包含常见问题排查与安全加固建议,帮助开发者快速建立稳定可靠的远程开发连接。

purple的博客 878

exception(异常处理)与try,catch,

转载:http://www.cnblogs.com/ggjucheng/archive/2011/12/18/2292089.html 引言 异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常,希望它的调用者可以直接或者间接处理这个问题。而传统错误处理技术,检查到一个局部无法处理的问题时: 1.终止程序(例如atol,atoi,输入NULL,会产生段错误,导致程序

haohao1945的博客 8317

PCB光绘文件DFM检查:从Gerber验证到制造闭环

Gerber文件是PCB设计交付制造的核心数据载体,其准确性直接决定硬件可制造性与量产良率。理解Gerber格式规范、IPC网表比对原理及DFM(Design for Manufacturability)自动检测逻辑,是电子工程师保障设计落地的关键能力。通过电气连通性验证、物理DRC规则扫描与工艺兼容性分析,DFM工具能提前识别开路、短路、孔环不足、阻焊异常等典型问题,避免投板后返工甚至批量报废。在国产化替代趋势下,华秋DFM等平台已深度适配Altium Designer工作流,支持一键导入、智能报告与协同

weixin_42620563的博客 507

基于Web的智能家居(源码+开题)

实践上,智能家居系统的普及和应用将极大改善人们的居住体验,提高生活质量,同时也有助于促进智能家居产业链的发展和完善,为社会经济发展注入新的活力。此外,本研究还将对基于Web的智能家居系统的用户体验进行深入研究,通过用户调研和数据分析,不断优化系统功能和界面设计,提升用户的使用体验和满意度。针对以上问题,本研究将综合运用物联网、云计算、大数据等新一代信息技术,通过系统架构设计、功能模块开发、安全性保障、用户体验优化等多个方面的研究工作,力求为基于Web的智能家居系统的研发和应用提供全面而有效的解决方案。

sryue06的博客 1904

KillTimer失败(SetTimer&KillTimer的大坑)

KillTimer失败问题解决(SetTimer&KillTimer的大坑)

NKhth的博客 1624

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1886

【MFC】MFC异常类——异常处理

01、目录 目录01、目录02、异常机制03、MFC异常宏04、MFC异常类05、MFC异常处理06、MFC异常处理实例07、小结 02、异常机制 我们开发的软件一般按照正常的流程操作时运行不会出问题,但是用户不一定会根据软件工程师的想法来操作软件,而且往往随机性很大,另外,软件的运行环境也会改变,例如硬盘空间不足、文件被移走,这些都可能会导致软件出现异常,甚至崩溃。所以我们进行软件开发时要充分考虑异常的捕捉和处理。 C++异常处理思想如下: 进行异常处理的目标是,使软件具有容错能力,在出现运行环境或者

Cain Xcy的博客 4543

PCIe协议之 Equalization篇 之 谈谈几种模式

对于两端有能力最高支持 32 GT/s 及以上速率的设备,如果把目标速度设置为 8 GT/s 或 16 GT/s 速率,是不建议采用 Bypass-Equalization-to-Highest-Rate 模式的,即便采用了,也不会针对 8 GT/s 或 16 GT/s 的目标速率进行 EQ。对于支持 32 GT/s 及以上速率的设备,其可能根本无需工作在 8 GT/s 或 16 GT/s 速率,这时再针对 8 GT/s 或 16 GT/s 速率进行 EQ,多少有点浪费。

那么菜的博客 567

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026

YOLO系列算法改进 | C2PSA改进篇 | 融合FSD频域结构解耦模块 | 双域解耦感知,兼顾全局亮度与局部纹理,适应红外小目标与边缘部署场景 | ICME 2026 (以YOLO26最新目标检测模型为基础,利用C2PSA_FSD创新模块进行改进)

2502_91881744的博客 316

6_5、MFC常用类:MFC异常处理

MFC异常处理

qingttqing的博客 856

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 295

Visual Studio/MFC编程入门:MFC异常处理

上一节中讲了CFile文件操作类,本节主要来说说MFC异常处理。在内容开始前为大家介绍两款MFC界面开发控件: Xtreme Toolkit Pro:是屡获殊荣的VC界面库,是MFC开发中最全面界面控件套包,它提供了Windows开发所需要的11种主流的Visual C++ MFC控件,包括Command Bars、Controls、Chart Pro、Calendar、Docking Pane、Property Grid、Report Control、Shortcut Bar、Syntax Edit、S

qq_42444778的博客 1478

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

MFC---异常处理(建议直接使用C++标准异常)(MFC常用类)

上一节中讲了CFile文件操作类,本节主要来说说MFC异常处理。在C++编程入门系列的最后一节:C++编程入门系列之五十(异常处理)中,讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。MFC异常处理与C++标准异常处理是类似的,只是它在抛出和捕获异常时使用了一些宏,另外还将异常封装到了CException类及其派生类中。下面就分别讲解这些宏与异常类。

Frank---7的博客 1081

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VS2010-MFC(MFC常用类:MFC异常处理)

转自:http://www.jizhuomi.com/software/236.html 上一节讲了CFile文件操作类,本节主要来说说MFC异常处理。 在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。 MFC异常处理与C++标准异常处理是类似的,只是它...

dgc70876的博客 511

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

mfc打开控制台异常关闭_VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)...

上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理。在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。MFC异常处理与C++标准异常处理是类似的,只是它在抛出和捕获异常时使用了一些宏,另外还将异常封装到了CException类及其派生类中。下面就分别讲解这些...

weixin_39819576的博客 226

MFC异常处理和诊断

编写程序时出一些错误是难免的,在C++中称在软件或硬件中发生的不期望或不需要的事件为异常(Exception)。MFC提供了两种异常处理机制: l C++异常,在MFC 3.0和更高版本中可以使用 l MFC异常,在MFC 1.0和更高版本中可以使用 在程序出错误后需要调试程序,MFC提供了许多诊断服务,可以让用户轻松的调试程序,这些诊断服务大多以特定宏和全局函数形式出现。 本章将向读者介

hireboy的专栏 1万+

VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)

http://www.jizhuomi.com/software/236.html 上一节中鸡啄米讲了CFile文件操作类,本节主要来说说MFC异常处理。        在鸡啄米C++编程入门系列的最后一节鸡啄米:C++编程入门系列之五十(异常处理)中,鸡啄米讲了C++标准异常的处理机制,如果你还没有学过这方面内容,可以到那节教程中去学习下。        MFC异常处理与C++标准异常处理...

parasoft的专栏 293

MFC 中 Halcon 异常处理

首先,在MFC的源文件里加上: void MyExceptionHandler(const HException& except) { throw except; } 其次,在OnInitDialog()中加入: //在try catch 使用前,进行安装自定义异常处理: HException::InstallHHandler(&MyExceptionHandler); 最后,使用 try { 需要捕获异常的代码块 } catch (HalconCpp::HException&a

weixin_43186817的博客 1730

MFC异常处理机制

MFC中异常处理的语法和语义构建在标准C++异常处理语法和语义的基础之上,其解决方案为:   MFC异常处理 = MFC 异常处理类 + 宏 1 宏   MFC定义了TRY、CATCH(及AND_CATCH、END_CATCH)和THROW(及THROW_LAST)等用于异常处理的宏,其本质上也是标准C++的try、catch和throw的进一步强化,由这些宏的定义可知: #i

zhouschina的专栏 1232

解密MFC中异常处理

在MFC中异常处理机制有两种: C++异常,在MFC3.0或者以后的版本才可用MFC异常宏,在MFC1.0或者以后的版本可用 如果你要用MFC,编写一个新应用程序,你应该使用C++异常机制,如果你现有的应用程序已近使用了MFC异常宏,你可以继续使用MFC异常宏。当然,你也可以用C++异常代替已有的MFC异常宏。 采用C++异常代替MFC异常宏优点: 使用C++异常,

老骥伏枥,志在千里 6281
上一篇: 异常处理(五、结构化异常处理)
下一篇: 异常处理(三、C++语言异常处理)
fairy_study
博客等级 码龄18年 29粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值