【发布时间】:2014-08-25 21:17:57
【问题描述】:
我有一个类,它的构造函数可能会抛出异常。下面是一些将捕获异常的代码:
try {
MyClass instance(3, 4, 5);
}
catch (MyClassException& ex) {
cerr << "There was an error creating the MyClass." << endl;
return 1;
}
当然,在 try/catch 之后没有代码可以看到 instance,因为它现在超出了范围。解决此问题的一种方法是分别声明和定义 instance:
MyClass instance;
try {
MyClass instance(3, 4, 5);
}
...
除了我的类没有合适的零参数构造函数。事实上,这里的这种情况是唯一一个这样的构造函数甚至有意义的例子:MyClass 对象旨在是不可变的,因为它的任何数据成员在构造后都不会改变。如果我要添加一个零参数构造函数,我需要引入一些实例变量,如 is_initialized_,然后在继续之前检查每个方法以确保该变量是 true。对于这样一个简单的模式来说,这似乎太过冗长了。
处理这种事情的惯用方法是什么?我是否需要接受它并允许在初始化我的类的实例之前声明它们?
【问题讨论】:
-
把所有代码放在一个函数里面,在try块中调用这个函数。
-
这没有意义。如果有异常,就没有对象,那么
instance有什么可能的需求? -
"处理这种事情的惯用方法是什么?" - 根本不要使用
try/catch,除非您可以在本地处理故障。 -
考虑重新设计你的类,这样构造函数就不会再遇到导致他首先抛出
MyClassException的错误情况。 -
您打算如何处理“创建失败”对象?如果您需要存储创建失败的原因,请将其存储在异常中。
标签: c++ constructor exception-handling scope try-catch