2015-04-06 36 views
1

我想处理默认值构造类成员中的异常。类似这样的:C++ c-tor处理默认成员值构造异常?

int func() 
{ 
    throw 9.0; 

    return 9; 
} 

struct T 
{ 
    T() try { 
    } 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    int a{func()}; 
} ; 

这可能吗?最新的ISO C++标准对此有何评论?

编辑:我实际上证实了自己它在大多数编译器上工作,但它是否定义良好,我应该通常使用这种构造?

+0

我很确定,如果你发现异常,就会被重新抛出。 – chris 2015-04-06 12:01:53

+0

为什么这样?你可以解释吗? – AnArrayOfFunctions 2015-04-06 12:02:20

+0

啊,*如果控件到达构造函数或析构函数的函数 - 尝试块 的处理函数的末尾,则重新抛出当前处理的异常* – chris 2015-04-06 12:03:41

回答

2

这可能吗?

是的,该异常将由功能级处理程序处理,就像成员初始化程序抛出的任何其他异常一样。请注意,在构造函数的function-try-block中,在处理它之后重新抛出异常。如果初始化子对象失败,这是你想要的,因为完整的对象是无效的。

最新的ISO C++标准对此有何评论?

我没有C++ 14还,但C++ 11说:

15/4:复合语句的执行,或者对构造过程中抛出的异常和析构函数, 初始化或破坏过程中,分别类的子对象的,将控制转移到一个处理程序 在函数试块以相同的方式作为试戴的执行过程中引发的异常块传输 控制给其他处理程序。

和15.3/15指定它在这种情况下重新排列。

我通常应该使用这个构造吗?

可能不是 - 你可以做些什么来处理子对象初始化失败的问题,所以在捕获和重新抛出异常时通常没有意义。您可能想要在异常通过时报告错误。

0

那是不可能的,你只能抓住你的构造函数体内做的事例外,像这样:

struct T 
{ 
    T() { 
    try { a = func();} 
    catch(...) 
    { 
     cout << __func__ << endl; 
    } 
    } 
} 

你也应该捕捉到了异常,但不是在构造函数,但在对象被构造。那就是:

try { 
    T t;//construct 
} 
catch(...) 
{}; 

这样你就失败了。

+1

问题中的语法非常有效,如果这就是你的意思。 – chris 2015-04-06 12:05:43