【发布时间】:2015-04-07 01:40:18
【问题描述】:
非常简单的问题,如何处理初始化可能从其构造函数中抛出异常的类成员变量?
class main
{
public:
main() c(...) {};
private:
my_class c;
};
class my_class
{
public:
inline my_class() : o(...) { };
private:
some_obj o;
};
显然您不能在构造函数初始化程序中尝试捕获异常,那么在构造函数中的 try catch 块中构造对象是否更合适?
这是一个顶级类,因此处理异常以让用户知道发生了什么并优雅地退出比让程序因异常而崩溃更重要?
class main
{
public:
main()
{
try
{
c(...);
}
catch(...)
{
...
}
};
private:
my_class c;
};
但是,这是行不通的,因为对象在构造函数中初始化之前会被初始化一次,因此如果对象抛出异常,程序可能会崩溃。
【问题讨论】:
-
您可以在构造函数中使用函数try-block,以捕获成员初始化期间引发的异常。请注意,这里唯一明智的做法是重新抛出异常。在大多数情况下,让程序继续处理部分构造的对象是糟糕的设计。
-
@MattMcNabb:构造函数或析构函数上的 function-try-block 在异常处理程序结束时自动重新抛出。
-
@MattMcNabb 是的,我不打算继续该程序,而是尝试执行更优雅的退出。
标签: c++ exception constructor