与异常处理相关

时间:2012-04-07 07:28:55

标签: c++

  

我正在尝试调用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();
}

1 个答案:

答案 0 :(得分:3)

您正在从~A()中抛出异常。从析构函数中抛出异常是危险的。如果另一个异常已经传播,则应用程序将终止。有关详细说明,请参阅https://stackoverflow.com/a/130123/72178

  

执行此代码时为什么会出现“Debug Error”窗口?

您从maintry中抛出异常。这将调用“堆栈展开”,并调用AB的析构函数。从~A()应用程序终止时抛出异常。

  

这是预期的行为?

是的,它由标准定义。

  

如何删除此错误?

不要从析构函数中抛出。