Chinaunix首页 | 论坛 | 博客
  • 博客访问: 779772
  • 博文数量: 239
  • 博客积分: 60
  • 博客等级: 民兵
  • 技术积分: 1045
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-22 18:25
文章分类

全部博文(239)

文章存档

2019年(9)

2018年(64)

2017年(2)

2016年(26)

2015年(30)

2014年(41)

2013年(65)

2012年(2)

分类: C/C++

2014-04-02 15:48:47

    C++异常书写不甚,就很容易造成std::terminate().
[Example:

点击(此处)折叠或打开

  1. struct TerminalThrow
  2. {
  3.     TerminalThrow(){}
  4.     TerminalThrow(const TerminalThrow&)
  5.     {
  6.         throw 0;
  7.     }
  8. };

  9. int main(int argc, char* argv[])
  10. {
  11.     try
  12.     {
  13.         throw TerminalThrow();
  14.         int delay = 0;
  15.         delay = delay;
  16.     }
  17.     catch (TerminalThrow ex)
  18.     {
  19.         int delay = 0;
  20.         delay = delay;
  21.     }

  22.     return 0;
  23. }

输出的部分汇编:

点击(此处)折叠或打开

  1. 10242619 8B 65 E8 mov esp,dword ptr [ebp-18h]
  2. 1024261C E8 5F 56 FC FF call terminate (10207C80h)
  3. 10242621 C7 45 FC FE FF FF FF mov dword ptr [ebp-4],0FFFFFFFEh
  4. 10242628 8B 4D F0 mov ecx,dword ptr [ebp-10h]
  5. 1024262B 64 89 0D 00 00 00 00 mov dword ptr fs:[0],ecx
  6. 10242632 59 pop ecx
  7. 10242633 5F pop edi
  8. 10242634 5E pop esi
  9. 10242635 5B pop ebx
  10. 10242636 8B E5 mov esp,ebp
  11. 10242638 5D pop ebp
  12. 10242639 C3 ret

结果分析:
    汇编中的”call terminate“表明测试程序即将被终止。因为异常在被捕捉到之前又抛出另一个异常,将导致程序终止。异常终止执行顺序:  
    [ throw TerminalThrow()  -> "raise exception"  -> "build catch exception" -> TerminalThrow(const TerminalThrow&)  ->  throw 0  -> std::terminate() ]; 

解决方法:
    1)可行性: 将语句 "catch (TerminalThrow ex) "修改成 "catch (TerminalThrow& ex)",这样就可以避免执行拷贝构造函数"TerminalThrow(const TerminalThrow&) ",就不会执行语句"throw 0;";所以很多情况都建议使用引用参数来捕捉异常。
    2)缺点: 在构造函数"TerminalThrow()"中抛出异常,还是会导致程序终止。
--end example]

[15.1.7  Throwing an exception   ISO/IEC 14882:2011(E)]
    If the exception handling mechanism, after completing evaluation of the expression to be thrown but before the  exception  is  caught,  calls  a  function  that  exits  via  an  exception, std::terminate  is  called  (15.5.1). 
阅读(975) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~