Иногда в коде я вижу бросать исключения, когда throw
ключевого слова используются без выражения рядом с ним:Что значит «бросать» пустое выражение?
throw;
Что это значит и когда я должен использовать?
Иногда в коде я вижу бросать исключения, когда throw
ключевого слова используются без выражения рядом с ним:Что значит «бросать» пустое выражение?
throw;
Что это значит и когда я должен использовать?
Пустой throw
отменяет исключение.
Он может отображаться только в catch
или в функции, вызванной от catch
.
Если пустой обработчик throw
встречается, когда обработчик не активен, будет вызван terminate
.
Это повторение текущего исключения.
Это не изменяет текущее исключение, а просто возобновляет разворачивание стека после выполнения действий в блоке catch {}.
Цитирование стандарт: § 15.1 объявления 8[except.throw]
Бросок-выражение без каких-либо операнда rethrows в данный момент обрабатывается исключение (15,3). Исключение возобновляется с существующим временным; не создается новый объект временного исключения. Исключение составляет больше не считается пойманным; поэтому значение
std::uncaught_exception()
снова будет истинным.Пример: код, который должен быть выполнен из-за исключения еще не может полностью обработать исключение может быть записана следующим образом:
try { // ... } catch (...) { // catch all exceptions // respond (partially) to exception throw; // pass the exception to some // other handler }
добавлена стандартная цитата:/ – sehe
Это rethrows исключение из текущего активного catch
блока.
try {
foo();
} catch (...) {
fix_some_local_thing();
throw; // keep searching for an error handler
}
Если нет в настоящее время активного catch
блока, он будет вызывать std::terminate
.
Что такое «активный блок catch»? – sehe
Последний, введенный обработкой исключений.(У вас может быть try..catch внутри блока catch и, следовательно, иметь вложенную обработку исключений.) –
Эта терминология для меня новая. Кроме того, я никогда не рассматривал блокировку «catch». «try/catch» блоки, может быть. Тогда, все же, «активный» кажется странным понятием, которое на самом деле не соответствует модели абстрактных машин C++. Я бы выбрал «обработчики исключений, зарегистрированных в текущем стоп-кадре», но мне было бы интересно, если у вас есть источник для вашей/лучшей терминологии. – sehe
Он используется внутри блока catch
, чтобы восстановить текущее исключение.
В объявлении функции это означает, что функция не будет вызывать никаких исключений.
В блоке catch
он повторно выбрасывает исключение, например.
try {
throw "exception";
catch (...) {
std::cout << "caught exception";
throw; // Will rethrow the const char* exception
}
Итак, он вернется в блок 'try'? –
Нет, он выдает исключение из следующего внешнего блока 'try'. Он может использоваться для локального реагирования на исключение, но также передачи исключения вызывающему. –
и [еще один ...] (http://stackoverflow.com/questions/1833982/in-c-is-there-a-difference-between-throw-and-throw-ex) (комментарий Фреда в это бесценно, кстати). – WhozCraig
@WhozCraig смешно. Я не помнил об этом, несмотря на то, что я трогал этот старый комментарий о вопросе-троллинге своим собственным комментарием чуть больше года назад:/ – sehe