我正在尝试调用terminate函数。 [我认为在堆栈展开期间出现另一个异常时会调用此函数]。我写的相同场景并试图验证。
我能够看到对terminate()函数的调用,但我不知道为什么我会调试Debug错误。
尝试在Visual Studio 2008中执行以下代码时,我收到一条错误消息对话框“Debug Error”。输出也会显示:
输出:
在try block中
在A
的构造函数中在B的构造函数中
在B的析构函数中
在A的析构函数中
调用my_terminate
执行此代码时为什么会出现“Debug Error”窗口?这是预期的行为?如何删除此错误?
class E
{
public:
const char* message;
E(const char* arg) : message(arg) { }
};
void my_terminate()
{
cout << "Call to my_terminate" << endl;
};
class A
{
public:
A() { cout << "In constructor of A" << endl; }
~A()
{
cout << "In destructor of A" << endl;
throw E("Exception thrown in ~A()");
}
};
class B
{
public:
B() { cout << "In constructor of B" << endl; }
~B() { cout << "In destructor of B" << endl; }
};
void main()
{
set_terminate(my_terminate);
try
{
cout << "In try block" << endl;
A a;
B b;
throw("Exception thrown in try block of main()");
}
catch (const char* e)
{
cout << "Exception: " << e << endl;
}
catch (...)
{
cout << "Some exception caught in main()" << endl;
}
cout << "Resume execution of main()" << endl;
getch();
}
答案 0 :(得分:3)
您正在从~A()
中抛出异常。从析构函数中抛出异常是危险的。如果另一个异常已经传播,则应用程序将终止。有关详细说明,请参阅https://stackoverflow.com/a/130123/72178。
执行此代码时为什么会出现“Debug Error”窗口?
您从main
块try
中抛出异常。这将调用“堆栈展开”,并调用A
和B
的析构函数。从~A()
应用程序终止时抛出异常。
这是预期的行为?
是的,它由标准定义。
如何删除此错误?
不要从析构函数中抛出。