Bootstrap

C++捕获异常


一、硬件异常和软件异常

Visual Studio中,对于C++应用程序有两种异常,一种是硬件异常,也叫结构化异常/C异常/异步异常,如访问了空指针(或无效地址)、整数除以0等等,常见的异常代码是:

EXCEPTION_ACCESS_VIOLATION
EXCEPTION_STACK_OVERFLOW
EXCEPTION_INT_DIVIDE_BY_ZERO

另一种是软件异常,也叫C++异常/同步异常。

二、异常的捕获

软件异常用try, catch来处理,比如:

int main() {
    try {
       int *p = new int;
    } catch (std::bad_alloc) {
       printf("catch error\n");
    }
    return 0;
}

而硬件异常一般用__try, __except结构来捕获,但这个不是C++标准,而是Windows平台特有的扩展,所以最好还是使用C++标准的try, catch来处理。这时会发现try, catch捕获不到硬件异常,请接着看下文。

三、/EHa和/EHs

EH 是 Exception Handling 的缩写,指的是两种 SEH 异常处理模型。查看工程属性:

示例图片

默认是选择/EHsc,只能捕获到软件异常,要想同时捕获到硬件异常,这里要选择/EHa。还有一点,就是当异常触发的时候,/EHa可以让局部对象的析构函数被调用(无论是硬件异常还是软件异常),而/EHs只能在触发软件异常的时候才保证局部对象的析构函数被调用,这就造成了内存泄露。

;