异常处理(四、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异常处理 结构化异常处理 立即下载

相关推荐

避开SiC MOSFET驱动设计的3个大坑:电流/电阻/电压配置全指南

本文深入解析SiC MOSFET驱动设计中的三大关键参数:驱动电流、栅极电阻和工作电压,揭示常见设计误区与优化方案。通过实际案例与数据对比,指导工程师避开第三代电力电子半导体应用中的典型陷阱,提升系统可靠性与效率。特别针对驱动电源配置、栅极电阻选型等核心问题提供可落地的解决方案。

weixin_29214199的博客 384

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

【位运算进阶之----右移(>>)】

😄嘻嘻,朋友们,大家好!昨天我们学习了左移,今天我们来谈谈右移>>。⭐️简单来说,,也就是去掉一个数的二进制表达的末位,右移一位就去掉一位,右移两位就去掉两位。下面就让我们来详细看看吧!

weixin_73453526的博客 8931

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

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

haohao1945的博客 8317

fluent二维叶型仿真_Fluent案例4【自然对流】

自然对流来了!!江苏的高校好多开学了,我啥时候才能开学另外,刚才看了何同学的Mac Pro深度体验视频,我好酸/(ㄒoㄒ)/~~好想拥有一台跑仿真那种sou~sou~sou~的机器。废话不多说了,进入正题!案例题目:一个矩形空腔内有500K恒温小球,矩形空腔充斥空气,边界条件绝热,模型尺寸如下,试模拟空腔内空气流动状态做出温度变化图。(尺寸大小懒得写了,在建模部分里有)操作平台:workbench...

weixin_39724469的博客 3670

VSCode里玩转AvaloniaUI:手把手教你搭建跨平台桌面应用开发环境(附.NET 7配置避坑)

本文详细介绍了如何在VSCode中搭建AvaloniaUI跨平台桌面应用开发环境,包括.NET 7配置避坑指南。从环境准备、项目创建到调试优化,手把手教你利用VSCode和Avalonia实现高效开发,特别解决了.NET 7依赖等常见问题,助力开发者快速上手跨平台应用开发。

weixin_28826545的博客 577

KillTimer失败(SetTimer&KillTimer的大坑)

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

NKhth的博客 1624

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3198

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

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

Cain Xcy的博客 4543

git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案

本文主要介绍了git clone出现fatal: unable to access Failed to connect to github.com port 443: Timed out解决方案,希望能对使用git的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 23万+

真格量化-bs套利

#!/usr/bin/env python # coding:utf-8 from PoboAPI import * import datetime import time import numpy as np from copy import * #开始时间,用于初始化一些参数 def OnStart(context) : context.myacc = None #登录交易账号 if context.accounts["回测期权"].Login() : co.

qq_26742269的博客 1321

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

MFC异常处理

qingttqing的博客 856

如何利用air780e与stm32c8c6进行通信实现给手机发送一条英文短信的功能?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1237

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

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

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

Frank---7的博客 1081

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

dgc70876的博客 511

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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、付费专栏及课程。

余额充值