如何捕获用花括号初始化的对象抛出的异常?
How can I catch an exception throw from an object initialized with curly braces?
我遇到了一个问题。我有这个:
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 ?
}
正如你所看到的,当我从头文件中初始化一个带花括号的对象时,我不知道如何得到异常。
谢谢你
这个实例演示了函数级try
块的技术。
A()
try {
/* code */
} catch( exception e ) {
throw e;
}
但是,注意,如果上面的构造捕获到某些东西,必须抛出异常。它不一定是相同的例外。这是因为A
的构造失败了(异常绕过了A
的部分构造,和/或A
的某些子对象的构造函数终止了),并且退出构造失败的构造函数的唯一方法是通过throw
。
我认为这是不可能的。实际上,这与避免调用成员变量的构造函数非常相似,并且会使A
的objB
成员不被构造。一个解决方案是将B
的构造函数分成两步:
- 不做任何事情的默认构造函数
- 产生异常的
initialize
方法。你可以把大括号传递给那个方法。 -
B
在做任何事情之前检查是否正确初始化。
相关文章:
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 创建具有 new in 函数和"this is nullptr"异常的对象
- 对象初始化后在C++中显示 char 数组时的异常行为
- 如何捕获 C++ 内置异常对象
- 对象接收堆栈溢出异常 c++ 的排序向量
- 堆异常 -1073741510对象
- std::bad_weak_ptr对象构造后shared_from_this异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 基于对象的两个属性的自定义比较器会引发异常
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 为什么内置类型的对象上的溢出会导致异常/未定义的行为?
- 如何防止构造函数在引发异常时创建对象
- std::system 实例化单一实例对象时的异常
- 异常对象的最后一个潜在销毁点
- 初始化引发异常的对象
- 调试器在异常C++时未挂起调试对象
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 在 C++ 中的构造函数中引发异常时销毁对象的成员变量
- C++ 异常处理:将异常定义为对象
- 从函数中抛出内部对象异常合法吗