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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值