0

有时在代码中,我看到在throw关键字旁边没有表达式的情况下抛出异常:

throw;

这是什么意思,我应该什么时候使用它?

4

5 回答 5

5

throw会重新引发异常。

它只能出现在 acatch或从 a 调用的函数中catch

throw如果在处理程序不活动时遇到空,terminate将被调用。

于 2013-08-27T14:11:39.320 回答
3

它重新抛出当前活动catch块的异常。

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

如果当前没有活动catch块,它将调用std::terminate.

于 2013-08-27T14:10:43.847 回答
1

这是对当前异常的重新抛出。

这不会改变当前的异常,实际上只是在执行 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
}
于 2013-08-27T14:10:39.553 回答
1

在函数声明中,这意味着函数不会抛出任何异常。

在一个catch块中,它重新抛出捕获的异常,例如

try {
   throw "exception";
catch ( ... ) {
   std::cout << "caught exception";
   throw; // Will rethrow the const char* exception
}
于 2013-08-27T14:11:16.503 回答
0

它在catch块内用于重新抛出当前异常。

于 2013-08-27T14:11:12.380 回答