我有几个自定义的异常类。 (不同的错误代码/错误消息) 其中一些导致终止。这就是为什么我让他们传播到主要。 要打印错误代码+消息。
如果我抓住了超类,是否有一种方法没有一个长的if else列表来检查我有哪些子类可以使用覆盖方法?
有多个catch语句会更具可读性吗?
我应该将它们降级到较低级别以获得更高的异常并且只捕获此异常吗?
答案 0 :(得分:6)
如果您需要以特定方式处理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) {
}
不是编译时错误,即使第二个分支也不能执行;您只需看到所有SubclassOfSubclassOfException
被处理,就好像它们只是SubclassOfException
一样。