【问题标题】:What happens when an exception is thrown while unwinding the stack from another exception?当从另一个异常展开堆栈时抛出异常会发生什么?
【发布时间】:2011-03-20 03:12:12
【问题描述】:

例如在下面的代码中:

#include <iostream>
using namespace std;
class A {
     public:
           A() { cout << "A::A()" << endl; }
           ~A() { cout << "A::~A()" << endl; throw "A::exception"; }
     };
class B {
     public:
           B() { cout << "B::B()" << endl; throw "B::exception"; }
           ~B() { cout << "B::~B()"; }
     };
int main(int, char**)
{
     try {
           cout << "Entering try...catch block" << endl;
           A objectA;
           B objectB;
           cout << "Exiting try...catch block" << endl;
     }
     catch (char* ex) {
           cout << ex << endl;
     }
     return 0;
}

B 的析构函数抛出异常,在展开堆栈时调用A 的析构函数,从而引发另一个异常。 节目会有什么反应?

【问题讨论】:

标签: exception-handling


【解决方案1】:

简短回答?砰,应用程序终止。

来自parashift

在堆栈展开期间,所有这些堆栈帧中的所有本地对象都被破坏。如果其中一个析构函数抛出异常(比如说它抛出了一个 Bar 对象),C++ 运行时系统就处于一个不成功的境地:它是否应该忽略 Bar 并最终进入

} catch (Foo e) { 

它最初的目标是什么?它是否应该忽略 Foo 并寻找

} catch (Bar e) { 

处理程序?没有好的答案——任何一种选择都会丢失信息。

所以C++语言保证此时会调用terminate(),而terminate()会杀死进程。砰,你死定了。

有关 Stack Overflow 的相关问题:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多