我可以想到多种方法来做到这一点:
1)您可以使用区分不同类型的异常instanceof
;例如
if (e instanceof Exception) {
if (e instanceof IOException) {
if (e instanceof FileNotFoundException) {
...
} else ...
} else ...
} else ...
2)您可以使用地图进行区分;例如
Map <Class, Integer> map = new HashMap<Class, Integer>();
map.put(FileNotFoundException.class, 1);
map.put(NullPointerException.class, 2);
...
Integer action = map.get(ex.getClass());
if (action != null) {
switch(action) {
case 1:
....
case 2:
...
}
}
3)在Java 7中,您可以通过打开异常类的名称来进行区分。
4) 在 Java 7(或者更早的 Java 版本……虽然“|”是 Java 7-ism)中,您可以抛出异常并使用try {} catch
它来区分它。
Throwable ex = ...
try {
throw ex;
} catch (IOException | InvalidArgumentException e) {
...
} catch (NullPointerException e) {
...
} catch (Throwable e) {
// catch all
}
(最后一个选项可以说是“对正常控制流使用异常”......但我相信它应该具有与其他选项相当的性能。使用异常的大部分成本是在创建异常实例时产生的,并且我们没有这样做。我们正在重新抛出之前创建的异常。)