C++异常处理
1、缺点(网上查到的):
在release下,如果在try语句块中(包括调用的函数)没有throw语句,则,整个try catch会被编译器给优化掉,不过这是符合C++标准的,因为C++标准说,catch必须能捕获程序中所有通过throw语句抛出的异常;至于内存访问违例,被0除等等系统异常则C++标准并未做要求。
要解决上面的问题也不难,在编译选项中加入/EHa即可防止编译器优化try语句。
总的来说,C++的异常处理还是比较依赖于不同的编译器和系统的,不是很稳定,移植性也比较差,Java的异常处理又总觉得不灵泛,让人没有选择,反倒是比较喜欢Python的异常处理机制,嘿嘿。
windows平台下的异常处理强大的原因在于系统的SEH(结构化异常)处理机制,其实try catch也是使用SEH的变形封装实现的
2、测试代码
#include <stdio.h> #include <windows.h> void main() { try { DWORD dwDemonObj = 0x0E; DWORD dwObjTypeAddr = dwDemonObj+0x8; DWORD dwObjType = *(DWORD*)dwObjTypeAddr; DWORD dwType = 0x2E; if (dwObjType != dwType) { printf("!="); } else { printf("=="); } } catch (...) { printf("catch ...\n"); } printf("main out\n"); }
ZC: 光键入上面的代码,在VC6中Release版本的exe里面是没有异常处理的。
3、
4、
5、