非常简单的问题,如何处理初始化可能从其构造函数中抛出异常的类成员变量?
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;
};
但是,这不会起作用,因为对象在构造函数中之前会被初始化一次,因此如果对象抛出异常,程序可能会崩溃。
答案 0 :(得分:2)
您需要的是function-try-block。它专门用于解决您的问题。
class main
{
public:
main() try : c(...)
{
std::cout << "constructed, c = " << c << std::endl;
}
catch(...)
{
std::cerr << "failed to construct c = " << c << std::endl;
} // implicit throw; here
private:
my_class c;
};
答案 1 :(得分:-1)
为什么你不能在构造函数中捕获错误?根据{{3}},它似乎是标准做法。