Что будет, если бросок; оператор выполняется вне блока catch? - PullRequest
12 голосов
/ 11 июня 2009

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

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

1 Ответ

24 голосов
/ 11 июня 2009

из стандарта, 15,1 / 8

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...