假设我想要一个堆栈分配的对象,该对象可能在构造过程中抛出,但又想在调用站点处理异常,我如何使该对象可以从构造它的 try 块外部访问?
例如
class MyThrowingClass {
MyThrowingClass() {throw exception();}
doSomethingImportant() {
//...
}
};
int main() {
//Need to catch the exception:
try {
MyThrowingClass myObj;
} catch() {
//actually handle the error
//...
}
//Also need to use myObj later on
myObj.doSomethingImportant();//but we can't use it here because it was scoped to the try block...
}
如果我将 myObj 封装在 try 中,则 try 范围之外的任何内容都看不到它,但我不想在其中包含其他所有内容,因为这样代码就变成了 30 级嵌套的 try 块,这就是异常处理应该使用 init 函数错误代码的替代方法来删除。
我无法在构造函数中处理异常,因为对异常的反应取决于使用 MyThrowingClass 的上下文。
显然这个问题可以通过一个
MyThrowingClass* pMyObj;
然后能够包装
pMyObj = new MyThrowingClass();
但这肯定也可以通过堆栈分配的对象来实现吗?
是做类似事情的唯一解决方案
MyThrowingClass myObj;
try {
myObj.init();
} catch(...) {
//...
}
在这一点上,我们基本上回到了与错误代码一样糟糕的状态,并且有一个未初始化或部分初始化的对象。
请注意,这不是一个全局对象,我想要在许多地方实例化的东西。
拥有一个包含整个作用域的 try 块(这里是 main 中的所有内容)并在该 try 块的末尾捕获处理每个可能的异常的 try 块,而不是能够模糊地处理附近的异常,这真的是理想的解决方案吗?到他们的网站?
int main() {
try {
//absoultely everything
}
catch (exceptionTypeA &a) {
//...
}
catch exceptionTypeB &b) {
}
}