Что значит «бросить»; заявление сделать? - PullRequest
46 голосов
/ 21 марта 2011

В эти дни я много читаю C ++ F.A.Q и особенно эту страницу .

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

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, о котором вы знаете?

Спасибо.

Ответы [ 3 ]

47 голосов
/ 21 марта 2011

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

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

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

38 голосов
/ 21 марта 2011

Да, это определенное поведение, он будет вызывать термин;

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

7 голосов
/ 21 марта 2011

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

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