抛出异常的C ++类构造函数

时间:2014-09-10 02:40:12

标签: c++ class exception constructor

让我们考虑使用 构造函数 投掷 异常 如下:

class Class
{
    public:
        Class(type argument)
        {
            if (argument == NULL)
            {
                throw std::exception("Value cannot be null.\nParameter name: argument");
            }

            // Instructions
        }
    private:
        // Properties
}

由于 构造函数 可能会抛出 异常 < / strong>我们无法直接声明 对象

Class obj(argument); // Harmful

这意味着必须调用 构造函数 必须使用 try / catch

try
{
    Class obj(argument);
}
catch (std::exception& ex)
{
    std::cout << ex.what() << std::endl;
}

问题是我们只能在 尝试 块中使用 对象 。在 尝试 块之外使用它的唯一方法是声明 Class * 指针 < / strong>然后使用 关键字构建新的 对象 ,然后将其地址分配给之前的 指针

Class* pObj;

try
{
    pObj = new Class(argument);
}
catch (std::exception& ex)
{
    std::cout << ex.what() << std::endl;
}

那么定义前一个 的标准方法是什么,以便在不使用 指针的情况下创建实例 还是动态内存分配?

提前谢谢

2 个答案:

答案 0 :(得分:4)

  

由于类构造函数可能抛出异常,因此我们无法声明   一个直接的对象。

是的,你可以。如果你真的有计划在函数中处理异常,你只需要把它放在一个try块中。如果你没有这样的计划,那么就让异常传播(尽管你最终应该抓住它,只是为了提供一份报告,如果没有其他的话)。

但是,假设您确实有计划在函数中处理异常,那么解决方案很简单。

try {
    Class obj(argument);
    // use obj here, inside the try block
}
catch(...) { ... }

// not here, outside the try block

编辑:通过下面的评论,你要么误解我,要么误解了你。也许需要一个具体的例子。让我们说这是你使用你的班级的功能:

void Foobar(type argument)
{
    Class obj(argument);
    obj.method1(1,2,3);
    obj.method2(3,4);
    int x = Wizbang(obj);
    gobble(x);    
}

现在,您想要处理Class构造函数可能抛出的异常。我所建议的是将所有垃圾放入一个try块中,然后将其放入try块中:

void Foobar(type argument)
{
    try
    {
        Class obj(argument);
        obj.method1(1,2,3);
        obj.method2(3,4);
        int x = Wizbang(obj);
        gobble(x);
    }
    catch(std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
}

如果你不能这样做,请解释原因。您已经说过&#34;我需要访问权限以便稍后使用该对象&#34; ,但您没有提供为什么&#34;以后&#34; 并不意味着&#34;稍后在创建对象的同一个try块中#34; 。因此,您的要求不完整。

答案 1 :(得分:0)

你想要的不是(合理地)可能的。假设有一些方法可以做你想要的,也就是说,创建一个Class类型的对象obj,它仍然在任何相关的try {} catch {}构造之外,用于处理构造函数中的异常。问自己的问题是,如果在构造obj期间抛出异常,并且你以某种方式处理异常然后执行将继续在obj仍然在范围内的块中,obj究竟包含什么?它从未构建过,所以只是在obj ????