有时在代码中,我看到在throw
关键字旁边没有表达式的情况下抛出异常:
throw;
这是什么意思,我应该什么时候使用它?
空throw
会重新引发异常。
它只能出现在 acatch
或从 a 调用的函数中catch
。
throw
如果在处理程序不活动时遇到空,terminate
将被调用。
它重新抛出当前活动catch
块的异常。
try {
foo();
} catch (...) {
fix_some_local_thing();
throw; // keep searching for an error handler
}
如果当前没有活动catch
块,它将调用std::terminate
.
这是对当前异常的重新抛出。
这不会改变当前的异常,实际上只是在执行 catch{} 块中的操作后恢复堆栈展开。
引用标准:§ 15.1 ad 8 [except.throw]
没有操作数的 throw 表达式重新抛出当前处理的异常 (15.3)。使用现有临时重新激活异常;没有创建新的临时异常对象。不再认为异常被捕获;因此, 的值
std::uncaught_exception()
将再次为 true。示例:由于异常必须执行但不能完全处理异常的代码可以这样写:
try { // ... } catch (...) { // catch all exceptions // respond (partially) to exception throw; // pass the exception to some // other handler }
在函数声明中,这意味着函数不会抛出任何异常。
在一个catch
块中,它重新抛出捕获的异常,例如
try {
throw "exception";
catch ( ... ) {
std::cout << "caught exception";
throw; // Will rethrow the const char* exception
}
它在catch
块内用于重新抛出当前异常。