Вложенные блоки try-catch? - PullRequest
2 голосов
/ 23 ноября 2011
int main ()
{
    try
    {
        try
        {
            throw 5;
        }
        catch (int n)
        {
            throw;
        }
    }
    catch (...)
    {
        cout << "Exception occurred";
    }
}

Это печатает "Исключение произошло", но

int main ()
{
    try
    {
        try
        {
            throw;
        }
        catch (...)
        {
            throw;
        }
    }
    catch (...)
    {
        cout << "Exception occurred";
    }
}

Это просто ошибки. Похоже, что я делаю пробный улов точно так же! Разница лишь в том, что в первом случае я выбрасываю int, затем общее исключение, но во втором случае я выбрасываю общее исключение оба раза. Не запуталась ли программа, к какому улову идти?

Ответы [ 2 ]

9 голосов
/ 23 ноября 2011

Нет такого понятия, как "общее исключение", и вы не выбрасываете такую ​​вещь.

В первом примере вы бросаете int, а затем повторно выбрасываете исключение, которое обрабатываете . В этом смысл throw без аргумента.

Во втором примере вы начинаете с попытки повторно вызвать исключение, которое вы обрабатываете. Поскольку в это время вы не обрабатываете исключение, вы получаете сообщение об ошибке.

3 голосов
/ 23 ноября 2011

Ваш второй пример завершает программу с хорошим сообщением об ошибке (по крайней мере, с помощью g ++ 4.6.1):

terminate called without an active exception
Aborted

Это происходит потому, что вы пытаетесь повторно вызвать исключение, но поскольку активных исключений нет, программа завершает работу.

Текущий черновик c ++ 11 в главе 15.5.1 гласит:

В некоторых ситуациях обработка исключений должна быть прекращена из-за меньшего количества тонкие методы обработки ошибок.

Тогда в списке случаев, когда вызывается std::terminate, это:

когда бросающее выражение без операнда пытается отбросить исключение и исключение не обрабатывается (15.1),

Итак, поведение из вашего второго примера хорошо определено в стандарте.

...