【问题标题】:what does "throw;" outside a catch block do?“投掷”是什么意思?外面有一个catch块吗?
【发布时间】:2011-02-11 03:12:19
【问题描述】:

我只是偶然发现了这段代码:

void somefunction()
{
   throw;
}

我想知道:这是什么意思?


我将问题标记为 C++ 和 Visual C++,因为我不知道答案。答案可能与标准或特殊的 Visual C++ 扩展或忽略标准的 Visual C++ 有关。这就是为什么我认为这两个标签都是合理的。

【问题讨论】:

  • 这个问题与 Visual Studio 或任何类型的“视觉”c++ 无关。请不要用具体的框架标签来标记通用 C++ 问题。
  • @Pavel Shved:如果有某种适用的语言扩展,这个问题可能与 VC++ 有关。在这种情况下,最好在此基础上回答它,同时根据标准指出答案。
  • @David, @Tobias,如果您不确定,我认为最好不要将问题标记为与 VC 相关。如果碰巧是语言扩展,社区将对其进行适当的重新标记。
  • @Pavel:如果提问者自己不确定,我想我宁愿看到它被标记为 VC++ 相关。这当然是有争议的。无论如何,托拜厄斯,请确保在重要的时候指定平台,尽管目前存在分歧的确切位置。

标签: c++


【解决方案1】:

意图可能是 somefunction() 只在某个 catch 块内部被调用。在这种情况下,当throw; 被执行时,将会有一个异常活动,在这种情况下,当前异常被重新抛出,被下一个可以处理该异常类型的外部处理程序捕获。

如果在异常未激活时执行throw;,它会调用terminate()(N4810,§[expr.throw]/4)。

【讨论】:

    【解决方案2】:

    它重新抛出当前活动的异常。只有从 catch 块中调用它(可能是间接地)才有意义。这个:

    #include <iostream>
    using namespace std;
    
    void f() {
        throw;
    }
    
    int main() {
        try {
            try {
                throw "foo";
            }
            catch( ... ) {
                f();
            }
        }
        catch( const char * s ) {
            cout << s << endl;
        }
    }
    

    打印“foo”。

    【讨论】:

      【解决方案3】:

      对于throw,“外部”或“内部”catch 块的概念是在运行时术语中定义的,而不是在您似乎假设的编译时术语中。因此,如果在运行时 throwcatch 块的运行时上下文中执行,则 throw 按预期工作。否则,将调用 terminate()

      事实上,如果你仔细看看 C++ 异常是如何在语言规范中定义的,就会发现很多关于它们的东西都是在运行时术语中定义的。有时它甚至看起来不像 C++。

      【讨论】:

      • 不,我没有假设这样的事情。但是我没有对函数的用法进行足够的评论。很抱歉造成误解。
      【解决方案4】:

      人们已经解释了它的含义,但了解您可能会看到它的原因可能很有用。这是构建“通用”异常处理程序的有用方法,该处理程序根据异常类型处理异常,从而减少重复代码的数量。

      因此,如果我们采用 Neil's example 并扩展 f() 可能正在做的事情,我们最终可能会得到一个类似于我在 this answer 中提出的 LogKnownException() 函数的实现。

      如果您所在的团队喜欢在各处记录各种异常,那么您可以使用简单的 catch像这样的块

      catch(...)
      {
         LogKnownException();
      }  
      

      虽然我希望我会将之前的 LogKnownException() 示例更改为仅允许其不想记录的异常传播出去并以未处理的方式继续执行的示例。

      我并不是说这一定是一件好事,只是指出这是您可能会看到使用该构造的地方。

      【讨论】:

        猜你喜欢
        • 2011-07-19
        • 2018-10-30
        • 1970-01-01
        • 2023-03-31
        • 2010-11-02
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多