C++ 如何从用大括号初始化的对象捕获异常抛出?
我面临一个问题。我有这个:C++ 如何从用大括号初始化的对象捕获异常抛出?,c++,exception,c++11,constructor,try-catch,C++,Exception,C++11,Constructor,Try Catch,我面临一个问题。我有这个: int main() { try { Class A obj; } catch() { ... } } class B { public: B(){throw an exception there from .cpp}; ~B(); }; class A { public: A(); ~A(); p
int main()
{
try
{
Class A obj;
}
catch()
{
...
}
}
class B
{
public:
B(){throw an exception there from .cpp};
~B();
};
class A
{
public:
A();
~A();
private:
B objB{} // <=== Exception from there, how can I catch it ?
}
intmain()
{
尝试
{
A级obj;
}
捕获()
{
...
}
}
B类
{
公众:
B(){从.cpp}抛出一个异常;
~B();
};
甲级
{
公众:
A();
~A();
私人:
B objB{}/我认为这本身是不可能的。事实上,这与A
的objB
成员非常相似,并且会使其未构造。解决方案是将B
的构造函数分为两步:
不执行任何操作的默认构造函数
调用异常的初始化方法。可以将大括号传递给该方法
B
在执行任何其他操作之前,请检查是否已正确初始化
这演示了函数级try
块的技术
A()
try {
/* code */
} catch( exception e ) {
throw e;
}
但是,请注意,如果上面的构造捕获了某个内容,则必须抛出一个异常。它不必是同一个异常。这是因为A
的构造失败了(异常绕过了A
的部分构造,和/或A
的某些子对象的构造函数已终止),而退出构造失败的构造函数的唯一方法是通过抛出注意,如果您想避免这种情况,可以将B
包装成与std::optional
等效的格式,并将构造延迟到您控制的代码内。作为一种副作用,a
可以具有B
与否,这样您就可以拥有一个有效的a
,而B
则失败。