比较异常

时间:2011-12-22 09:11:00

标签: java exception control-flow

这是我的场景,我有一个包含任意异常的例外列表,例如来自不同的层次结构,而波纹管代码快照将解释我需要做什么

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.
}

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

我知道,控制流程取决于异常是不是很好的做法。但是,我需要这样做。

5 个答案:

答案 0 :(得分:2)

您可以拥有多个catch - 块,每个块只捕获一个特定的例外。

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

或者,要真正检查列表中是否有例外,请使用connectionExceptions.contains(e.getClass())

答案 1 :(得分:2)

由于Exception类使用Object类的 equals()函数,connectionExceptions.contains(e)不会产生正确的答案,因为每个Exception e实例都有相同的原因和堆栈跟踪将具有不同的默认HEX标识。但是,如果您想比较两个例外,可以使用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
    }
  }
}

答案 2 :(得分:1)

if (connectionExceptions.contains(e) {
   //
}

如果您需要列表是动态的,那就是这样。否则使用:

} catch (FooException) {

} catch (BarException) {

}

或Java7中的多捕获:

} catch (FirstException | SecondException ex) {

答案 3 :(得分:0)

Peter Knego解释了如何比较answer中的例外情况。

基本上,您可以使用instanceof进行比较。

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

答案 4 :(得分:-1)

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

  • 详细维护列表,Map或每个Exception的任何内容(例如 如果可能bile,类型,类等异常)
  • 当你在catch块中检查异常时,只需使用一些 由Java泛型类提供的函数。

这是您可以为此方案做的最好的事情。