在构造函数 C++ 中处理 Try-catch 块
Handling Try-catch block in a constructor C++
我面临这样一种情况,我需要在构造函数中使用 try-catch 块。特别是,构造函数尝试调用 try 块中的函数,如果失败,它将调用另一个函数来设置一些值。在这两种情况下,构造函数都应该正确地创建对象,并且在这两种情况下它都必须在结束之前调用一些其他方法。情况如下:
class A{
A(int i){
try{
setDevice(i);
}
catch(DeviceException& ex){
setDevice (0);
throw ex;
}
otherMethod();
}
}
但是,如果在 try 块中发生错误,则不会调用 otherMethod()
,因为执行在 catch 块内结束,我不能像在其他语言中那样使用 finally 来做到这一点。
此外,我什至不确定在 try 块内引发异常时,是否会自动调用析构函数,因此未正确创建对象。
在这种情况下你有什么建议?即使到达 catch 块,对象是否正确创建?
如果您已经处理了异常,请不要重新抛出它。删除 throw ex;
以在 catch
块之外进行并正常完成构造函数。
如果异常离开构造函数,则认为该对象没有被初始化。不会调用析构函数;但是那些为任何成员和基础子对象分配的内存将被释放。
(如果你确实想重新抛出,那应该只是 throw;
以避免制作异常对象的新副本。但你也不希望在这里。)
我面临这样一种情况,我需要在构造函数中使用 try-catch 块。特别是,构造函数尝试调用 try 块中的函数,如果失败,它将调用另一个函数来设置一些值。在这两种情况下,构造函数都应该正确地创建对象,并且在这两种情况下它都必须在结束之前调用一些其他方法。情况如下:
class A{
A(int i){
try{
setDevice(i);
}
catch(DeviceException& ex){
setDevice (0);
throw ex;
}
otherMethod();
}
}
但是,如果在 try 块中发生错误,则不会调用 otherMethod()
,因为执行在 catch 块内结束,我不能像在其他语言中那样使用 finally 来做到这一点。
此外,我什至不确定在 try 块内引发异常时,是否会自动调用析构函数,因此未正确创建对象。
在这种情况下你有什么建议?即使到达 catch 块,对象是否正确创建?
如果您已经处理了异常,请不要重新抛出它。删除 throw ex;
以在 catch
块之外进行并正常完成构造函数。
如果异常离开构造函数,则认为该对象没有被初始化。不会调用析构函数;但是那些为任何成员和基础子对象分配的内存将被释放。
(如果你确实想重新抛出,那应该只是 throw;
以避免制作异常对象的新副本。但你也不希望在这里。)