这个语法的含义是什么?

9

我之前在一个SO问题中看到了一种奇特的语法。

class B{
    A a;
    public:
        B() try : a() {} catch(string& s) { cout << &s << " " << s << endl; };
};

这个try-catch块在函数外部有什么意义?
2个回答

10
这是一个函数try块。它在派生类构造函数中用于捕获错误。您可以在标准文件(例如n3337草案的第15和15.1节)中了解更多有关此功能的信息。

4个函数try块将处理程序序列与构造函数初始化器(如果存在)和复合语句相关联。在执行复合语句期间或对于构造函数和析构函数,在类的子对象的初始化或销毁期间抛出异常,将控制转移到同一函数try块中的处理程序,就像在执行try块期间抛出异常将控制转移给其他处理程序一样。 [示例:

int f(int);
class C {
int i;
double d;
public:
C(int, double);
};
C::C(int ii, double id)
try : i(f(ii)), d(id) {
// constructor statements
}
catch (...) {
// handles exceptions thrown from the ctor-initializer
// and from the constructor statements
}

—示例结束 ]


1
请参阅http://www.drdobbs.com/introduction-to-function-try-blocks/184401297以获取更深入的解释和原理。 - pmr
@PermanentGuest 这个功能很少被使用,因为在你的 catch 块结束时,异常将被重新抛出,如果你没有抛出其他异常。function-try-block 不能处理异常。 - ForEveR

0

它捕获从构造函数中抛出的异常,当创建成员对象时。你提到的问题的其中一个答案包含了一个解释细节的链接:http://www.gotw.ca/gotw/066.htm


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接