Что произойдет, если я использую "throw;"без исключения скинуть? - PullRequest
9 голосов
/ 18 февраля 2010

Вот настройка.

У меня есть программа на C ++, которая вызывает несколько функций, каждая из которых потенциально генерирует один и тот же набор исключений, и я хочу одинакового поведения для исключений в каждой функции (например, сообщение об ошибке печати& сбросить все данные по умолчанию для исключения A; просто распечатать для исключения B; завершить работу для всех остальных исключений).

Похоже, я должен иметь возможность установить поведение перехвата для вызова закрытой функции, котораяпросто сбрасывает ошибку и выполняет перехват, вот так:

void aFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void bFunction()
{
    try{ /* do some stuff that might throw */ }
    catch(...){handle();}
}

void handle()
{
    try{throw;}
    catch(anException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(anotherException)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
    catch(...)
    {
        // common code for both aFunction and bFunction
        // involving the exception they threw
    }
}

Теперь, что произойдет, если «handle» вызывается вне класса исключения.Я знаю, что это никогда не должно произойти, но мне интересно, если поведение не определено стандартом C ++.

Ответы [ 3 ]

16 голосов
/ 18 февраля 2010

Если handle() вызывается вне контекста исключения, вы будете throw без обработки исключения. В этом случае стандарт (см. Раздел 15.5.1) определяет, что

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

поэтому ваше приложение будет прекращено. Это, вероятно, не то, что вы хотите здесь.

5 голосов
/ 18 февраля 2010

Если вы используете throw внутри блока catch, он сгенерирует исключение. Если вы используете throw вне блока catch, это приведет к прекращению работы приложения.

1 голос
/ 18 февраля 2010

Никогда, никогда, никогда не используйте catch (...), так как вы можете перехватывать ошибки приложения, которые вы не хотите перехватывать, например, ошибки, нарушения прав доступа (в зависимости от того, как вы скомпилировали).

Прочитайте замечательную книгу Джона Роббинса (Отладка приложений Windows), в которой он более подробно объясняет, почему вы не должны этого делать.

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