一、硬件异常和软件异常
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只能在触发软件异常的时候才保证局部对象的析构函数被调用,这就造成了内存泄露。