从构造函数中捕获异常意味着我的实例后来超出了范围

bde*_*ham 3 c++ constructor scope exception-handling try-catch

我有一个类,其构造函数可能会抛出异常.这里有一些代码可以捕获异常:

try {
    MyClass instance(3, 4, 5);
}
catch (MyClassException& ex) {
    cerr << "There was an error creating the MyClass." << endl;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

但是当然,try/catch之后没有代码可以看到,instance因为它现在超出了范围.解决这个问题的一种方法是分别声明和定义instance:

MyClass instance;
try {
    MyClass instance(3, 4, 5);
}
...
Run Code Online (Sandbox Code Playgroud)

除了我的类没有适当的零参数构造函数.事实上,这里的这个案例是唯一一个这样的构造函数甚至有意义的案例:MyClass对象是不可变的,因为它的数据成员在构造之后都没有变化.如果我要添加一个零参数构造函数,我需要引入一些类似的实例变量is_initialized_,然后检查每个方法以确保该变量true在继续之前.对于这样一个简单的模式来说,这似乎太过冗长.

处理这种事情的惯用方法是什么?我是否需要将其填充并允许在初始化之前声明我的类的实例?

Jos*_*eld 11

您应该在块执行您需要执行的所有操作try:

try {
    MyClass instance(3, 4, 5);

    // Use instance here
}
catch (MyClassException& ex) {
    cerr << "There was an error creating the MyClass." << endl;
    return 1;
}
Run Code Online (Sandbox Code Playgroud)

毕竟,它只在已成功创建的try块内instance,因此可以使用.

我想知道你的catch块是否真的处理异常.如果你无法解决问题,你应该让它传播.

  • 如果使用“instance”的代码也可能抛出异常怎么办?我会为这些添加额外的“catch”块吗?我的直觉是在“try”中放置尽可能少的代码。 (2认同)