2012-04-07 3 views
0

Я пытаюсь вызвать функцию завершения. [Я думаю, что эта функция вызывается, когда возникает другое исключение при раскручивании стека]. Тот же сценарий, который я написал и пытаюсь проверить.Связано с обработкой исключений

Я могу видеть, что вызов выполняется для функции terminate(), но я не уверен, почему я получаю сообщение об ошибке Debug.

При попытке выполнить следующий код в Visual Studio 2008, я получаю диалоговое окно с сообщением об ошибке «Ошибка отладки». Также отображаются выход:

Выход:

В блоке Ьги

В конструктору

В конструкторе B

В деструкторе B

В деструкторе A

Звонок на my_terminate

Почему это окно «Ошибка отладки» появляется во время выполнения этого кода? Ожидается поведение? Как удалить эту ошибку?

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(); 
} 

ответ

3

Вы выбрасываете исключение из ~A(). Выбрасывание исключения из деструктора опасно. Если другое исключение уже распространяется, приложение завершится. См. https://stackoverflow.com/a/130123/72178 для более подробного описания.

Почему это окно «Ошибка отладки» появляется во время выполнения этого кода?

Вы выбрасываете исключение в main от try блок. Это вызывает «Stack unwinding» и вызываются деструкторы A и B. Когда исключение вызывается из ~A(), приложение завершается.

Ожидаемое поведение?

Да, он определен стандартом.

Как удалить эту ошибку?

Не выбрасывайте из деструкторов.

+0

Я уверен, что вопрос: «Почему это исключение не попало в блоки блокировки?» – Mat

Смежные вопросы