Подтвердить что ты не робот

Что делает один "бросок"? выражение делать?

В эти дни я много читал С++ 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, о котором вы знаете?

Спасибо.

4b9b3361

Ответ 1

Если вы выполняете throw; самостоятельно, и для него не существует текущего исключения, то программа заканчивается внезапно. (Более конкретно, вызывается terminate().)

Обратите внимание, что throw; является единственным безопасным способом повторного выброса текущего исключения - он не эквивалентен

catch (exception const & e) { throw e; }

Ответ 2

Да, он указал поведение, он будет вызывать terminate;

15.1, para 8: Если в настоящее время исключение не выполняется, выполнение вызывать выражение без вызовов операндов terminate() (15.5.1).

Ответ 3

Этот так называемый обработчик исключений. Он перезапускает "текущее исключение", если оно есть. Если в настоящее время исключение исключено, terminate() будет вызываться.