无法catch的exception

原创 2006年05月18日 00:00:00

昨天花了不少时间debug客户碰到的一个蹊跷的程序错误。最终发现了问题是由一个C++异常抛出后无法catch到而导致的( 喏,这位老兄也提出了同样的问题)。此前一直自以为exception总是可以被安全catch到的。如果你也这么认为的话,呵呵, 那么你也应该去翻翻C++文档了。

查阅了c++文档后发现,在以下情况,exception并不会被抛出。取而代之的是,terminate()将被调用。

  • when the exception handling mechanism, after completing evaluation of the expression to be thrown but before the exception is caught (except.throw), calls a user function that exits via an uncaught exception,*
  • when the exception handling mechanism cannot find a handler for a thrown exception (except.handle), or
  • when the destruction of an object during stack unwinding (except.ctor) exits using an exception, or
  • when construction or destruction of a non-local object with static storage duration exits using an exception (basic.start.init), or
  • when a throw-expression with no operand attempts to rethrow an exception and no exception is being handled (except.throw), or
  • when unexpected throws an exception which is not allowed by the previously violated exception-specification, and std::bad_exception is not included in that exception-specification (except.unexpected), or

之所以说问题蹊跷, 在于在客户环境下似乎任何exception都最终被terminate掉。如下几行代码编译执行后得到输出为"terminated!"!

#include <iostream.h>
using std::set_terminate;

void myterminate()
  {
      cout<<"terminated!"<<endl;
      exit(1);
  }
  int main()
  {
      set_terminate(myterminate);
      try {
          throw 10;
      }
      catch (int& test)
      {
          cout<<"catched!"<<endl;
      }
      return 0;
  }

 该问题只在gcc-3.3的库libstdc++.so上发现。但还是不敢妄下结论是gcc-3.3的bug。

catch(Exception e)

作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉:   try   {   // 代码块   }   catch(Exception e)   {   // 异常处理   } ...
  • u014131893
  • u014131893
  • 2014年03月31日 23:07
  • 3291

关于try{} catch(exception e )

由一句话带来的三种思考,起初看异常处理看得云里雾里,对于try catch()  更是不知所谓,最近看多线程以及到论坛查找,就这句话有了一些最基本的理解。     在java中,异常存在三种...
  • zc1192947231
  • zc1192947231
  • 2015年09月11日 21:58
  • 2859

异常的类型catch中不同的Exception

FileReader的对象   FileNotFoundException 错误传递给构造方法一个null,构造方法将抛出一个NullPointException空指针异 构造方法初始化了一个文件输...
  • qq_32311977
  • qq_32311977
  • 2015年12月09日 14:27
  • 1269

在zend framework框架中try{}catch(Exception e){}的跳转问题

在zend framework框架中try{}catch(Exception e){}的render跳转问题的解决方法
  • yanlintao1
  • yanlintao1
  • 2014年05月31日 00:36
  • 1535

exception(异常处理)与try,catch,

转载:http://www.cnblogs.com/ggjucheng/archive/2011/12/18/2292089.html 引言 异常,让一个函数可以在发现自己无法处理的错误时抛出一个异常...
  • haohao1945
  • haohao1945
  • 2016年05月10日 17:31
  • 1594

catch exception when loading tinker:java.lang.IllegalAccessError

catch exception when loading tinker:java.lang.IllegalAccessError: Class ref in pre-verified class re...
  • qq_35352552
  • qq_35352552
  • 2017年06月17日 14:13
  • 1071

深入理解try catch吃掉异常,及catch(Exception e)中的异常

package test.s; public class yichang { public static void main(String[] args) throws Exception{ ...
  • csdnliuxin123524
  • csdnliuxin123524
  • 2017年11月28日 17:41
  • 244

c#,catch(Exception ex)的ex是什么意思

catch(Exception ex) { MessageBox.Show(ex.Message); ex就表示捕获的异常类对象。
  • dbagaoshou
  • dbagaoshou
  • 2015年12月03日 16:13
  • 3551

c++异常Try catch

一、简单的例子 首先通过一个简单的例子来熟悉C++ 的 try/catch/throw: 1 #include //包含头...
  • ghevinn
  • ghevinn
  • 2014年04月09日 17:43
  • 7144

Unreachable catch block for SQLException. This exception is never thrown from the try statement body

public boolean deleteAllByUid() { try { List list = findAllByUid(); if (list != null) { ...
  • zhuhai__yizhi
  • zhuhai__yizhi
  • 2014年12月01日 10:59
  • 3070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:无法catch的exception
举报原因:
原因补充:

(最多只允许输入30个字)