Git*_*Git 1 java error-handling exception
我有几个自定义的异常类.(不同的错误代码/错误消息)其中一些导致终止.这就是为什么我让他们传播到主要.要打印错误代码+消息.
如果我抓住超类,有没有一个方法没有一个长的if else列表来检查我有哪些子类来获得覆盖方法?
拥有多个catch语句会更具可读性吗?
我应该将它们放在较低级别以更高级别的Exception并且只捕获此异常吗?
如果您需要以SubclassOfException特定方式处理,请使用catch SubclassOfException.
instanceof当这基本上是异常处理已经完成的时候,使用一系列检查毫无意义.
try {
} catch (SubclassOfException e) {
// Do something specific to SubclassOfException
} catch (Exception e) {
// Do something for other types.
}
Run Code Online (Sandbox Code Playgroud)
基本相同:
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.
}
}
Run Code Online (Sandbox Code Playgroud)
我认为很明显第一个是更易读的,并且它将更有效地执行,因为这是JVM期望编写异常处理代码的方式.
以第一种方式写作的另一个好处是你不能写:
try {
// ...
} catch (SubclassOfException e) {
} catch (SubclassOfSubclassOfException e) {
}
Run Code Online (Sandbox Code Playgroud)
因为第一个catch会捕获所有与第二个catch匹配的异常,使第二个catch更加冗余.因此,这是一个编译时错误,在JLS Sec 11.2.3中描述:
如果catch子句可以捕获异常类E1并且紧跟的try语句的前一个catch子句可以捕获E1或E1的超类,那么这是一个编译时错误.
您需要首先捕获最具体的类型,然后捕获最不具体的类型.
另一方面,
if (e instanceof SubclassOfException) {
} else if (e instanceof SubclassOfSubclassOfException) {
}
Run Code Online (Sandbox Code Playgroud)
即使第二个分支也不能执行,它不是编译时错误; 你只是看到所有人都SubclassOfSubclassOfException被处理好像他们只是一样SubclassOfException.
| 归档时间: |
|
| 查看次数: |
671 次 |
| 最近记录: |