我想在更高级别处理异常,而不是在这种方法中,但我想确保对象a& b正确关闭。
close()方法也可以抛出异常。
这个模板是否适合这个解决方案,或者有一个更聪明/更简单的解决方案?
public void foo() throws Exception {
A a = null;
B b = null;
try {
a = new A();
b = new B();
...
} catch(Exception e) {
throw e;
}
finally {
Exception ex = null;
try {
if (a != null)
a.close();
} catch(Exception x){
ex = x;
}
try {
if (b != null)
b.close();
} catch(Exception x) {
ex = x;
}
if (ex != null)
throw ex;
}
答案 0 :(得分:1)
A a = null;
try
{
a = new A();
//do stuff
}
finally
{
a.Close();
}
try
块不需要catch
块,需要catch
或finally
块(或两者)。
答案 1 :(得分:1)
此问题的正确解决方案(在C#中)是using
语句:
using(A a = new A())
using(B b = new B())
{
//...
}
这可确保当控件离开块时a
和b
都为Dispose
。
答案 2 :(得分:1)
我只看到一个小问题:如果a.close()
和b.close()
都失败,则a.close()
的异常会丢失,因为您重复使用ex
。
您可以使用记录器来保存异常消息 - 在这种情况下,只需在finally块中抛出任何异常就足够了,因为您已将错误消息保存在日志文件中。
答案 3 :(得分:1)
除了 Femaref 所说的,你可以创建一个带有一个或多个可关闭对象的辅助方法,并在必要时抛出异常。只需减少冗余。
通常需要返回原始错误消息,而不是close
调用期间发生的错误消息。后者可能直接来自前者,但你需要前者才能找到问题的真正原因。