Что должно напечатать?
int main(int argc, char* argv[])
{
try
{
throw(std::overflow_error("err"));
}
catch(std::overflow_error&)
{
printf("In catch(std::overflow_error&)\n");
throw;
}
catch(std::exception&)
{
printf("In catch(std::exception&)\n");
}
printf("End\n");
return 0;
}
Здравствуйте, Аноним, Вы писали:
А>Что должно напечатать?
Проверил (g++ 4.2.1):
[c0der@xxx ~]$ ./rethrow
In catch(std::overflow_error&)
terminate called after throwing an instance of 'std::overflow_error'
what(): err
zsh: abort ./rethrow
Т.е., как видим, первый catch сработал, перевыбросил исключение, и его уже никто не поймал и никто не обработал.
PC>Проверил (g++ 4.2.1):
Так я тоже умею
Я вот раньше думал, что оно попадёт во второй catch
PC>PC>[c0der@xxx ~]$ ./rethrow
PC>In catch(std::overflow_error&)
PC>terminate called after throwing an instance of 'std::overflow_error'
PC> what(): err
PC>zsh: abort ./rethrow
PC>Т.е., как видим, первый catch сработал, перевыбросил исключение, и его уже никто не поймал и никто не обработал.
Здравствуйте, <Аноним>, Вы писали:
А>Что должно напечатать?
throw (и re-throw в частности) выбрасывает за пределы блока try-catch-catch-catch(...).
Собственно, серия catch ловит только то, что вылетело из try, а не из предшествующих catch.
Поэтому будет напечатано
In catch(std::overflow_error)
Unhandled exception, не хотите ли запустить отладчик?
(Вторая строчка — это частный случай неопределённого поведения).
... << RSDN@Home 1.2.0 alpha rev. 655>>
А>>Что должно напечатать?
К>throw (и re-throw в частности) выбрасывает за пределы блока try-catch-catch-catch(...).
К>Собственно, серия catch ловит только то, что вылетело из try, а не из предшествующих catch.
Но, вообще-то первый раз оно вылетело из try.
Это особенно хорошо заметно в C# (и, наверное, Java), где внутри исключения есть информация, откуда оно вылетело (файл, номер строки).
К>Поэтому будет напечатано
К>К>In catch(std::overflow_error)
К>Unhandled exception, не хотите ли запустить отладчик?
К>
К>(Вторая строчка — это частный случай неопределённого поведения).