这是我的场景,我有一个包含任意异常的例外列表,例如来自不同的层次结构,而波纹管代码快照将解释我需要做什么
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.
}
那么,我如何比较异常,如果异常在列表中或其他一些异常,我需要某种行为......
我知道,控制流程取决于异常是不是很好的做法。但是,我需要这样做。答案 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块中抛出)是否在你的列表中”。因此,为了检查这一点,检查机制应该非常直接或详细,我的意思是,
这是您可以为此方案做的最好的事情。