В C ++ throw;
при выполнении внутри блока catch перебрасывает текущее захваченное исключение вне блока.
В этот ответ идея диспетчера исключений возникает в качестве решения для уменьшения дублирования кода при частой использовании сложной обработки исключений:
try {
CodeThatMightThrow();
} catch(...) {
ExceptionHandler();
}
void ExceptionHandler()
{
try {
throw;
} catch( FileException* e ) {
//do handling with some complex logic
delete e;
} catch( GenericException* e ) {
//do handling with other complex logic
delete e;
}
}
Бросок указателя или значения не имеет значения, поэтому об этом не может быть и речи.
Что произойдет, если ExceptionHandler () вызывается не из блока catch?
Я пробовал этот код с VC7:
int main( int, char** )
{
try {
throw;
} catch( ... ) {
MessageBox( 0, "", "", 0 );
}
return 0;
}
Сначала он заставляет отладчик указать исключение первого шанса, а затем сразу необработанное исключение. Если я запускаю этот код вне отладчика, программа вылетает так же, как если бы вызывалась abort ().
Какое поведение ожидается в таких ситуациях?