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、

 

posted @ 2016-05-25 13:59  CppSkill  阅读(302)  评论(0编辑  收藏  举报