Подтвердить что ты не робот

Что произойдет, если бросок; оператор выполняется вне блока catch?

В С++ 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().

Какое ожидаемое поведение для таких ситуаций?

4b9b3361

Ответ 1

Из стандарта, 15.1/8

Если в настоящее время не выполняется какое-либо исключение, выполняется выражение throw без каких-либо операндов std::terminate().