异常:使用 MFC 宏及 C++ 异常
来源:互联网 发布:编程机器人2.0 编辑:程序博客网 时间:2024/06/09 14:24
本文论述同时使用 MFC 异常处理宏及 C++ 异常处理关键字编写代码时的注意事项。
本文阐述了以下主题:
- 混合使用异常关键字与宏
- Catch 块内部的 Try 块
混合使用异常关键字与宏
可在同一程序中混合使用 MFC 异常宏及 C++ 异常关键字。但不可在同一个块中混合使用 MFC 宏及 C++ 异常关键字,因为当异常对象超出范围时宏自动将其删除,而使用异常处理关键字的代码则不会。有关更多信息,请参见文章异常:捕捉和删除异常。
宏与关键字之间的主要差异是,当异常超出范围时宏“自动”删除捕捉到的异常。使用关键字的代码则不然;在 catch 块中捕捉到的异常必须被显式删除。当异常对象未被删除时混合使用宏及 C++ 异常关键字可导致内存泄漏,当异常被删除两次时则会导致堆损坏。
例如,下列代码使异常指针无效:
TRY{ TRY { // Do something to throw an exception. } CATCH(CException, e) // The "inner" catch block { throw; // Invalid attempt to throw exception // to the outer catch block below. } END_CATCH}CATCH(CException, e) // The "outer" catch block{ // Pointer e is invalid because // it was deleted in the inner catch block.}END_CATCH
该问题的发生是因为当执行从“内部”CATCH 块传出时 e
被删除。使用 THROW_LAST 宏而不是 THROW 语句将使“外部”CATCH 块接收到有效的指针:
TRY{ TRY { // Do something to throw an exception. } CATCH(CException, e) // The "inner" catch block { THROW_LAST(); // Throw exception to the outer catch block below. } END_CATCH}CATCH(CException, e) // The "outer" catch block{ // Pointer e is valid because // THROW_LAST() was used.}END_CATCH
Catch 块内部的 Try 块
不能从 CATCH 块内部的 try 块中再次引发当前异常。下列示例无效:
TRY{ // Do something to throw an exception.}CATCH(CException, e){ try { throw; // Wrong. Causes e (the exception // being thrown) to be deleted. } catch(CException exception) { }}END_CATCH
- 异常:使用 MFC 宏及 C++ 异常
- C,C++,MFC 异常处理(zz)
- C,C++,MFC 异常处理(zz)
- java 异常及异常使用总结
- java 异常及异常使用总结
- c++MFC之出现异常--richedit控件
- 何时及如何使用异常
- Redis异常及使用总结
- forall使用及异常处理
- 【C#】常见的异常及异常处理方式
- Visual C++ 之 MFC异常宏和异常类
- c/objective-c/win32/mfc/qt 异常处理与总结
- c/objective-c/win32/mfc/qt 异常处理与总结
- c/objective-c/win32/mfc/qt 异常处理与总结
- C异常
- 【c++】异常
- 关于MFC中的异常
- MFC异常处理
- 在outlook6中如何设置163的信箱
- 解决好人的问题,流程和工具才会更有意义
- 深入浅出C#2008从入门到提高Step By Step(五)Windows应用程序常用控件类(5)-RadioButton
- 女人怎么去爱自己的男人!!(给女士们看看)声明我是男的 ^_^
- 深入浅出C#2008从入门到提高Step By Step(五)Windows应用程序常用控件类(6)-ListControl
- 异常:使用 MFC 宏及 C++ 异常
- 深入浅出C#2008从入门到提高Step By Step(五)Windows应用程序常用控件类(7)-ListBox
- vista u盘无法安装驱动程序(!!!!我来解决!!!!)
- 一个用C#开发的DirectShow媒体播放器(作者:Daniel Strigl)
- sql 2005 备份与恢复
- 为何C#属性名称的首字母要大写
- 深入浅出C#2008从入门到提高Step By Step(五)Windows应用程序常用控件类(8)-ComboBox
- __cdecl __fastcall与 __stdcall的区别
- nutch正文提取分析