C++ 你真的可以有一个没有主体的函数/方法,而只是一个try/catch块吗?

C++ 你真的可以有一个没有主体的函数/方法,而只是一个try/catch块吗?,c++,g++,try-catch,C++,G++,Try Catch,请注意,此函数没有“{”和“}”主体。只是一个try/catch块: void func( void ) try { ... } catch(...) { ... } 这是C++的有意部分,还是这是G++扩展?< /P> 除了绕过1级{}之外,还有其他目的吗 我从来没有听说过这个,直到我遇到了是的,它是标准的。函数try块,正如它们被调用的那样,对于常规函数没有太多的用处,但是对于构造函数,它们允许您捕获在初始化器列表中抛出的异常 注意,在构造函数的情况下,异常总是在任何cat

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

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

这是C++的有意部分,还是这是G++扩展?< /P> 除了绕过1级{}之外,还有其他目的吗


我从来没有听说过这个,直到我遇到了

是的,它是标准的。函数try块,正如它们被调用的那样,对于常规函数没有太多的用处,但是对于构造函数,它们允许您捕获在初始化器列表中抛出的异常


注意,在构造函数的情况下,异常总是在任何catch块的结尾重新抛出。

< P>是的,这是有效的C++。我发现它的一个用途是将异常转换为返回值,并使转换返回值中异常的代码与函数中的其他代码分开。是的,您可以
返回x来自一个catch块,就像你展示的那样(实际上,我最近才发现)。但在这种情况下,我可能会使用另一个级别的大括号,并将try/catch放在函数中。对于大多数C++程序员来说,这将是比较熟悉的。
另一个目的是捕获构造函数初始值设定项列表引发的异常,该列表使用类似的语法:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};
struct f{
g成员;
f()尝试{
//空的
}捕获(…){
标准:cerr