Что делает один "бросок"? выражение делать?
В эти дни я много читал С++ FAQ и особенно этой страницы.
Прочитав раздел, я обнаружил "технику", которую автор называет "диспетчером исключений", которая позволяет кому-то группировать все свои обработки исключений в одной удобной функции:
void handleException()
{
try {
throw; // ?!
}
catch (MyException& e) {
//...code to handle MyException...
}
catch (YourException& e) {
//...code to handle YourException...
}
}
void f()
{
try {
//...something that might throw...
}
catch (...) {
handleException();
}
}
Что меня беспокоит, это единственный оператор throw;
: если вы считаете данный пример уверенным, очевидно, что он делает: он вызывает первое исключение, впервые попавшее в f()
, и снова обрабатывает его.
Но что, если я сам называю handleException()
самостоятельно, не делая этого из предложения catch()
? Есть ли определенное поведение?
Дополнительно для бонусных очков есть ли другое "странное" (возможно, не хорошее слово) использование throw
, о котором вы знаете?
Спасибо.
Ответы
Ответ 1
Если вы выполняете throw;
самостоятельно, и для него не существует текущего исключения, то программа заканчивается внезапно. (Более конкретно, вызывается terminate()
.)
Обратите внимание, что throw; является единственным безопасным способом повторного выброса текущего исключения - он не эквивалентен
catch (exception const & e) { throw e; }
Ответ 2
Да, он указал поведение, он будет вызывать terminate;
15.1, para 8: Если в настоящее время исключение не выполняется, выполнение вызывать выражение без вызовов операндов terminate() (15.5.1).
Ответ 3
Этот так называемый обработчик исключений. Он перезапускает "текущее исключение", если оно есть. Если в настоящее время исключение исключено, terminate()
будет вызываться.