代码之家  ›  专栏  ›  技术社区  ›  Tobias Langner

什么是“扔”在一个街区外,你怎么办?

c++
  •  19
  • Tobias Langner  · 技术社区  · 16 年前

    我偶然发现了这个代码:

    void somefunction()
    {
       throw;
    }
    

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


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

    4 回复  |  直到 16 年前
        1
  •  30
  •   Jerry Coffin    7 年前

    目的可能是 somefunction() catch 阻止。在这种情况下,当 throw;

    如果 投掷; 在异常不活动时执行,它调用 terminate() (N4810,§[表达式抛出]/4)。

        2
  •  9
  •   anon anon    16 年前

    它重新抛出当前活动的异常。只有从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
  •  5
  •   AnT stands with Russia    16 年前

    throw “外部”或“内部”catch块的概念是在运行时术语中定义的,而不是在编译时术语中定义的。所以,如果在运行时 扔 在的运行时上下文中执行 catch 那就封锁吧 扔 按预期工作。否则, terminate() 被称为。

        4
  •  3
  •   Community Mohan Dere    9 年前

    人们已经解释了它的含义,但是知道为什么你会看到它可能是有用的。构造一个“泛型”异常处理程序是一种有用的方法,它可以根据异常的类型来处理异常,从而减少重复代码的数量。

    所以,如果我们 Neil's example f() 我们可能会得到一个类似于 LogKnownException() 我提议的功能 this answer

    如果您所在的团队喜欢记录各种各样的异常,那么与其在所有这些位置(或者更糟糕的是宏)都有大量catch块集合,不如有一个简单的catch块,如下所示

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

    虽然我想我会改变我以前的例子 只允许不想登录的异常以未处理的方式传播出去并继续。

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