C++异常处理

Posted CppSkill

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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、

 

以上是关于C++异常处理的主要内容,如果未能解决你的问题,请参考以下文章

C++异常处理:掌握高效健壮代码的秘密武器

使用源代码行信息处理 C++ 异常

C++异常处理的学习笔记

PCL异常处理:pcl 1.8.13rdpartyoostincludeoost-1_64oost ypeofmsvc ypeof_impl.hpp(125): error(代码片段

c++析构函数需要异常处理吗?如需要实现有何要求?

《c++徒步》基础语法篇