如果您需要以特定方式处理SubclassOfException,请使用catch SubclassOfException。
当这基本上是异常处理已经做的事情时,使用instanceof 检查链是没有意义的。
try {
} catch (SubclassOfException e) {
// Do something specific to SubclassOfException
} catch (Exception e) {
// Do something for other types.
}
基本相同:
try {
} catch (Exception e) {
if (e instanceof SubclassOfException) {
// Do something specific to SubclassOfException.
// Note that you have to cast explicitly if you want to use
// subclass-specific properties of SubclassOfException.
} else {
// Do something for other types.
}
}
我认为第一个更易读,执行效率更高,因为这是 JVM 期望编写异常处理代码的方式。
第一种写法的另一个好处是不会写:
try {
// ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
因为第一个 catch 会捕获所有要与第二个 catch 匹配的异常,从而使第二个 catch 变得多余。因此,这是一个编译时错误,在JLS Sec 11.2.3 中描述:
如果 catch 子句可以捕获异常类 E1 并且紧接在其内的 try 语句的前面的 catch 子句可以捕获 E1 或 E1 的超类,则这是编译时错误。
您需要先捕获最具体的类型,然后再捕获最不具体的类型。
另一方面,
if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}
不是编译时错误,即使第二个分支也无法执行;你只会看到所有SubclassOfSubclassOfExceptions 都被当作只是SubclassOfExceptions 来处理。