15

请注意,此函数没有“{”和“}”主体。只是一个 try/catch 块:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

这是有意成为 C++ 的一部分,还是 g++ 扩展?

除了绕过 {} 的 1 级之外,还有其他目的吗?

在遇到http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html之前我从来没有听说过这个

4

2 回答 2

11

是的,那是有效的 C++。我发现它的一个目的是将异常转换为返回值,并将返回值中的异常转换代码与函数中的其他代码分开。是的,你可以return x;像你展示的那样从一个 catch 块(实际上我最近才发现)。但在这种情况下,我可能会使用另一层大括号并将 try/catch 放在函数中。大多数 C++ 程序员会更熟悉它。

另一个目的是捕获构造函数初始化列表抛出的异常,它使用类似的语法:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};
于 2008-12-02T23:53:56.257 回答
9

是的,这是标准的。函数 try 块,因为它们被称为,对常规函数没有太多用处,但对于构​​造函数,它们允许您捕获在初始化列表中抛出的异常。

请注意,在构造函数的情况下,异常将始终在任何 catch 块的末尾重新抛出。

于 2008-12-02T23:50:10.853 回答