未捕获的异常

thi*_*nom 4 c++

为什么抛出的异常getA()没有被抓住?

#include<iostream>
using namespace std;

class Base{

protected:
    int a;
public:
    Base() { a=34; }
    Base(int i){ a = i; }
    virtual ~Base() { if(a<0) throw a; }
    virtual int getA()
    {
        if(a < 0) { throw a;}
    }
};

int main()
{
    try
    {
        Base b(-25);
        cout << endl << b.getA();
    }
    catch (int) {
        cout << endl << "Illegal initialization";
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我理解你对堆栈展开的看法.
如果我改为Base下面,我现在进行"非法初始化"调试打印.为什么我不再打电话了terminate()?

Base() { a=34; }
Base(int i){ a = i;  if(a<0) throw a;}
virtual ~Base() { if(a<0) throw a; }
virtual int getA()
{
    return a;
}
Run Code Online (Sandbox Code Playgroud)

sha*_*oth 16

在调用之后getA()抛出第一个异常,所谓的堆栈展开开始,对象被破坏.当对象被销毁时,它的析构函数会抛出另一个异常,它会逃避析构函数的主体(因为在堆栈展开期间会发生这种情况),这会导致terminate()C++运行时立即调用,程序终止.

在你提交的第二个片段中,异常被抛出在构造函数中,因此构造函数没有完成,并且从不调用析构函数(因为析构函数只调用完全构造的对象),因此没有terminate()调用的机会.

  • ...因此,为什么你应该养成*从不在析构函数中抛出*的习惯...... (7认同)
  • @Nim:不是"永不扔",而是"永远不要让它在析构函数之外传播". (7认同)