2013-08-27 5 views
0

Иногда в коде я вижу бросать исключения, когда throw ключевого слова используются без выражения рядом с ним:Что значит «бросать» пустое выражение?

throw; 

Что это значит и когда я должен использовать?

+0

и [еще один ...] (http://stackoverflow.com/questions/1833982/in-c-is-there-a-difference-between-throw-and-throw-ex) (комментарий Фреда в это бесценно, кстати). – WhozCraig

+0

@WhozCraig смешно. Я не помнил об этом, несмотря на то, что я трогал этот старый комментарий о вопросе-троллинге своим собственным комментарием чуть больше года назад:/ – sehe

ответ

5

Пустой throw отменяет исключение.

Он может отображаться только в catch или в функции, вызванной от catch.

Если пустой обработчик throw встречается, когда обработчик не активен, будет вызван terminate.

1

Это повторение текущего исключения.

Это не изменяет текущее исключение, а просто возобновляет разворачивание стека после выполнения действий в блоке 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 
} 
+0

добавлена ​​стандартная цитата:/ – sehe

3

Это rethrows исключение из текущего активного catch блока.

try { 
    foo(); 
} catch (...) { 
    fix_some_local_thing(); 
    throw; // keep searching for an error handler 
} 

Если нет в настоящее время активного catch блока, он будет вызывать std::terminate.

+0

Что такое «активный блок catch»? – sehe

+0

Последний, введенный обработкой исключений.(У вас может быть try..catch внутри блока catch и, следовательно, иметь вложенную обработку исключений.) –

+0

Эта терминология для меня новая. Кроме того, я никогда не рассматривал блокировку «catch». «try/catch» блоки, может быть. Тогда, все же, «активный» кажется странным понятием, которое на самом деле не соответствует модели абстрактных машин C++. Я бы выбрал «обработчики исключений, зарегистрированных в текущем стоп-кадре», но мне было бы интересно, если у вас есть источник для вашей/лучшей терминологии. – sehe

0

Он используется внутри блока catch, чтобы восстановить текущее исключение.

1

В объявлении функции это означает, что функция не будет вызывать никаких исключений.

В блоке catch он повторно выбрасывает исключение, например.

try { 
    throw "exception"; 
catch (...) { 
    std::cout << "caught exception"; 
    throw; // Will rethrow the const char* exception 
} 
+0

Итак, он вернется в блок 'try'? –

+0

Нет, он выдает исключение из следующего внешнего блока 'try'. Он может использоваться для локального реагирования на исключение, но также передачи исключения вызывающему. –

Смежные вопросы