如何正确处理多个异常thrower对象

时间:2011-02-20 21:40:51

标签: java

我想在更高级别处理异常,而不是在这种方法中,但我想确保对象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;
 }

4 个答案:

答案 0 :(得分:1)

A a = null;
try
{
  a = new A();
  //do stuff
}
finally
{
  a.Close();
}

try块不需要catch块,需要catchfinally块(或两者)。

答案 1 :(得分:1)

此问题的正确解决方案(在C#中)是using语句:

using(A a = new A())
using(B b = new B())
{
    //...
}

这可确保当控件离开块时ab都为Dispose

答案 2 :(得分:1)

我只看到一个小问题:如果a.close()b.close()都失败,则a.close()的异常会丢失,因为您重复使用ex

您可以使用记录器来保存异常消息 - 在这种情况下,只需在finally块中抛出任何异常就足够了,因为您已将错误消息保存在日志文件中。

答案 3 :(得分:1)

  1. 除了 Femaref 所说的,你可以创建一个带有一个或多个可关闭对象的辅助方法,并在必要时抛出异常。只需减少冗余。

  2. 通常需要返回原始错误消息,而不是close调用期间发生的错误消息。后者可能直接来自前者,但你需要前者才能找到问题的真正原因。