В С++ 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().
Какое ожидаемое поведение для таких ситуаций?