无法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)   {   // 异常处理   } ...

throw exception和 try catch的区别

1. 区别: throw exception直接终止方法,或者退出循环。 try catch还要继续处理方法余下的逻辑,或者不结束循环。 try catch 不中断,throw exceptio...

[转载] Basic try-catch-finally Exception Handling in Java

此文章转载自 Exception handling in Java Table of Contents The Call Stack ExplainedThrowing Except...

JAVA学习笔记25——异常机制1:Exception简介+异常处理的try_catch_finally方法

最近在看JAVA教学的视频,觉得老师讲的很好,同时借用源代码还有笔记来撰写本系列博客,记录自己的学习内容,同时也供看到的人学习。 本篇和下一篇来介绍一下JAVA的异常机制,异常是程序执行的一种例外,...

catch exception when loading tinker:java.lang.IllegalAccessError

catch exception when loading tinker:java.lang.IllegalAccessError: Class ref in pre-verified class re...

More Beyond "More Effective C++: catch exception through reference"

当你写一个catch子句时,必须确定让异常通过何种方式传递到catch子句里。你可以有三个选择:与你给函数传递参数一样,通过指针(by pointer),通过传值(by value)或通过引用(by ...

Exception的try{}catch{}处理(return)

public static void main(String[] args) {       String remark = String.format("备忘内容:本订单预计下单金额%s元,参加促销...

Java异常处理( try catch finally throw throws exception error)

Java异常处理机制当程序中抛出一个异常后,程序从程序中导致异常的代码处跳出,java虚拟机检测寻找和try关键字匹配的处理该异常的catch块,如果找到,将控制权交到catch块中的代码,然后继续往...

在catch块中throw new Exception的意义 .

throw new Exception(String, Exception) throw new Exception(String) throw是明确地抛出异常 MSDN:Exception...

try{} catch(…){} Exception handling options. /EHa vs /EHsc

以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的。例如下面的代码:try{BYTE* pch ;pch ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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