c ++如何处理抛出异常的初始化程序

时间:2015-04-07 01:40:18

标签: c++ exception constructor

非常简单的问题,如何处理初始化可能从其构造函数中抛出异常的类成员变量?

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;
};

但是,这不会起作用,因为对象在构造函数中之前会被初始化一次,因此如果对象抛出异常,程序可能会崩溃。

2 个答案:

答案 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}},它似乎是标准做法。