在从另一个异常中展开堆栈时抛出异常会发生什么?

hiz*_*zki 4 exception-handling

例如,在以下代码中:

#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;
}
Run Code Online (Sandbox Code Playgroud)

B析构函数抛出一个异常,它A在展开堆栈时调用析构函数,导致抛出另一个异常.该计划的反应是什么?

Kon*_*rad 6

简短的回答?Bang,申请终止.

parashift:

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

} catch (Foo e) { 
Run Code Online (Sandbox Code Playgroud)

最初的地方?它应该忽略Foo并寻找一个

} catch (Bar e) { 
Run Code Online (Sandbox Code Playgroud)

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

所以C++语言保证它会terminate()在此时调用,并terminate()杀死进程.砰,你死了.

Stack Overflow的相关问题: