【问题标题】:What does it mean to "throw" an empty expression? [duplicate]“抛出”一个空表达式是什么意思? [复制]
【发布时间】:2013-08-27 14:08:44
【问题描述】:

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

throw;

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

【问题讨论】:

  • another one...(顺便说一句,弗雷德在这篇文章中的评论是无价的)。
  • @WhozCraig 很有趣。我不记得了,尽管一年多前我用自己的评论评论了那个古老的古老的问题评论:/

标签: c++ exception


【解决方案1】:

空的throw 会重新引发异常。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 什么是“活动捕获块”?
    • 异常处理最近输入的一个。 (您可以在 catch 块中使用 try..catch,从而进行嵌套的异常处理。)
    • 这个术语对我来说是新的。此外,我从未考虑过“捕获”块处于活动状态。 'try/catch' 块,也许。然后,仍然,“活动”似乎是一个奇怪的概念,与 C++ 抽象机器模型并不完全一致。我会选择“在当前调用堆栈中注册的异常处理程序”,但如果您有您/更好术语的来源,我会很感兴趣。
    • 我相信“活跃”是标准使用的术语——至少,我以前见过很多次。
    • “当前异常对象”,或“当前处理的异常”。
    【解决方案3】:

    在函数声明中,表示该函数不会抛出任何异常。

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

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

    【讨论】:

    • 所以它会回到try块?
    • 不,它将异常抛出到下一个外部 try 块。它可以用来在本地对异常做出反应,也可以将异常传递给调用者。
    【解决方案4】:

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

    这不会改变当前异常,实际上只是在执行 catch{} 块中的操作后恢复堆栈展开。

    引用标准:§ 15.1 ad 8 [except.throw]

    没有操作数的 throw 表达式重新抛出当前处理的异常 (15.3)。 异常被现有的临时重新激活;没有创建新的临时异常对象。该异常不再认为被捕获;因此,std::uncaught_exception() 的值将再次为真

    示例:由于异常必须执行但不能完全处理异常的代码可以这样写:

    try {
    // ...
    } catch (...) { // catch all exceptions
    // respond (partially) to exception
    throw; // pass the exception to some
    // other handler
    }
    

    【讨论】:

    • 添加标准引用:/
    【解决方案5】:

    catch 块内使用它来重新抛出当前异常。

    【讨论】:

      猜你喜欢
      • 2013-10-13
      • 2013-11-22
      • 2015-06-21
      • 2016-06-10
      • 2012-08-03
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多