C++异常处理

结构化异常(structured exception) vs C++异常(C++ exception)

大家都知道C++异常是C++语言的一个特性,用户可以使用throw的方式来抛出异常,try{} catch(...){}来捕获异常。结构化异常是诸如,Zero Divided,  Access violations等异常,这些异常是由系统支持的,并非语言特性。在C语言或者汇编也可以截获这类异常。

struct EXCEPTION_REGISTRATION
{
   EXCEPTION_REGISTRATION *prev;
   DWORD handler;
};

mov FS:[0], exc_regp

通过向FS寄存器注册异常处理回调函数来实现。在C++里面可以使用

 __try {
 }
__except(EXCEPTION_EXECUTE_HANDLER) { 

}

来截获,编译器会自动生成相应的汇编代码。

 

同步异常 vs 异步异常

这个属于C++编译器的选项,在VS2008里面对应的是EHs(异步异常)和EHa(同步异常),在同步异常的情况下try{} catch(...){}会截获C++异常和结构化异常,用户就不需要另外写__try{}__exception{}这样的冗余代码了。但是如果是异步异常的时候,就只能截获C++异常。VS2008在编译debug版本的时候使用同步异常,使用release编译的时候是异步异常。异步异常有一个重要的优化,就是如果检查到try里面的所有语句都没有调用throw,那么catch部分的代码将被优化掉!

所以在捕获异常的时候要小心哦,必须清楚明白自己想要捕获什么样的异常,以决定使用什么样的方式。

 

下面是一个使用例子:

 

参考文章:

http://msdn.microsoft.com/en-us/library/1deeycx5(VS.80).aspx

http://www.codeproject.com/KB/cpp/exceptionhandler.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值