一般来说(对于 Java 6 及以下版本),您应该单独处理每个异常...
try {
myObject.myMethod();
} catch (ExceptionA e) {
// Condition for A
} catch (ExceptionB e) {
// Condition for B
} catch (ExceptionC e) {
// Condition for C
}
这允许您根据每个异常的不同来处理每个异常,但也意味着您只处理那些报告为由方法抛出的异常
在 Java 7+ 中,您可以使用“multi-catch”或“combined catch”(我们找不到“官方”术语)
try {
myObject.myMethod();
} catch (ExceptionA | ExceptionB | ExceptionC e) {
// Condition for A and B and C
}
但即便如此,您也应该将例外集中在“常见”使用组中
try {
myObject.myMethod();
} catch (ExceptionA | ExceptionB e) {
// Condition for A and B
} catch (ExceptionC e) {
// Condition for C
}
如果您控制异常的定义方式,另一种选择是从公共基础异常扩展,这方面的一个很好的例子是 FileNotFoundException,它从 IOException 扩展而来,FileReader 和FileInputStream(作为示例),这意味着您可以根据需要将FileNotFoundException 作为普通IOException 处理...
FileReader fr = null;
try {
fr = new FileReader(new File(...));
// Read from reader...
} catch (IOException exp) {
// Common catch block
} finally {
// Best attempt to close
try {
fr.close();
} catch (Exception exp) {
}
}
或者您可以根据自己的情况处理FileNotFoundException...
FileReader fr = null;
try {
fr = new FileReader(new File(...));
// Read from reader...
} catch (FileNotFoundException exp) {
// File not found condition
} catch (IOException exp) {
// Other IO condition
} finally {
// Best attempt to close
try {
if (fr != null) {
fr.close();
}
} catch (Exception exp) {
}
}
这允许您将“喜欢”的异常组合在一起,但也可以让您在需要时定义更细粒度的条件...
但请注意,在上面的示例中,如果我将 IOException 放在首位,FileNotFoundException 将永远不会被处理,这样做时,请确保首先使用最低/最严格/最好的异常,因为它们是按照您列出的顺序依次处理
另一个选项(我不喜欢,但已经看到)可能是捕获一个“共同”祖先,然后比较实际类型,这将允许您为异常的某些子类型提供通用处理程序.
} catch (IOException exp) {
if (exp instanceof FileNotFound || exp instanceof FileSystemException) {
// Common handling
} else {
// Generic handling
}
}
这在方法只抛出祖先类型(即IOException)的情况下可能会有所帮助,但您需要提供更细粒度的分辨率
但是,我将再次专注于处理声明为已抛出的预期“常见”异常,例如,不要急于捕捉 Throwable