【问题标题】:Comparing exceptions比较异常
【发布时间】:2011-12-22 09:10:59
【问题描述】:

这是我的场景,我有一个异常列表,其中包含来自不同层次结构的任意异常,下面的代码快照将解释我需要做什么

private List<java.lang.Class> connectionExceptions;
try {

// trying to connect to external module;

} catch(Exception e) {
   // Need to compare this exception e with a list of exceptions which I have, 
   // and the action depends on the results. There may be some other exception 
   // which are not in the list.
}

那么,我如何比较异常,如果异常在列表中或其他一些中,我需要采取某种操作...

我知道,控制流依赖于异常不是好的做法。但是,我必须这样做。

【问题讨论】:

  • 为什么不能使用List&lt;Exception&gt;

标签: java exception control-flow


【解决方案1】:

您可以有多个catch-blocks,每个都只捕获一个特定的异常。

...
catch(SomeException e) {
  //do something
}
catch(SomeOtherException e) {
  //do something else
}

或者,要真正检查异常是否在您的列表中,请使用connectionExceptions.contains(e.getClass())

【讨论】:

  • 如果列表有来自不同层次结构的异常会发生什么..?
【解决方案2】:

由于Exception 类使用Object 类的equals() 函数,connectionExceptions.contains(e) 不会产生正确答案,因为每个具有相同原因的异常 e 实例和堆栈跟踪将有不同默认十六进制标识。但是,如果您确实想比较两个异常,可以使用Arrays.deepEquals(Object, Object)

catch (Exception e) {
  boolean sameException = false;
  for (Exception ee : connectionExceptions) {
    sameException = Arrays.deepEquals(e.getStackTrace(), ee.getStackTrace());
    if (sameException) {
      break;  //exception matched
    }
  }
}

【讨论】:

  • 请解释为什么Arrays.deepEquals()应该比Arrays.equals()更受欢迎
【解决方案3】:
if (connectionExceptions.contains(e) {
   //
}

如果您需要动态列表。否则使用:

} catch (FooException) {

} catch (BarException) {

}

或者Java7中的multi-catch:

} catch (FirstException | SecondException ex) {

【讨论】:

  • 哎呀,是的。定影。我希望它实际上是Class,它更有意义
  • @Bozho :我已经更新了问题,感谢您的建议。
  • 我猜Exception 没有适当的覆盖equals() 方法,导致它使用超类Object 的equals 使用身份比较(==)。跨度>
【解决方案4】:

Peter Knego 在此 answer 中解释了如何比较异常。

基本上可以用instanceof来比较。

for (java.lang.Class exception : connectionExceptions) {
    if (e instanceof exception) {
        // DO YOUR THING
        break;
    }
}

【讨论】:

    【解决方案5】:

    Abimaran,您的问题是“检查异常(在 try 块中抛出)是否在您的列表中”。因此,为了检查这一点,检查机制应该非常直接或详细,我的意思是,

    • 详细维护每个异常的列表、地图或任何东西(如 如果有异常的胆汁、类型、类别等)
    • 当您在 catch 块中检查异常时,只需使用一些 Java 泛型类提供的函数。

    这是您在这种情况下可以做的最好的事情。

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多