你真的有一个没有身体但只是一个try / catch块的函数/方法吗?

时间:2008-12-02 23:44:30

标签: c++ g++ try-catch

请注意,此功能没有“{”和“}”正文。只是一个try / catch块:

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

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

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

在我遇到http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

之前,我从未听说过这个

3 个答案:

答案 0 :(得分:9)

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

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

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

Herb Sutter有一篇很好的文章:http://www.gotw.ca/gotw/066.htm