扩展异常处理

Git*_*Git 1 java error-handling exception

我有几个自定义的异常类.(不同的错误代码/错误消息)其中一些导致终止.这就是为什么我让他们传播到主要.要打印错误代码+消息.

如果我抓住超类,有没有一个方法没有一个长的if else列表来检查我有哪些子类来获得覆盖方法?

拥有多个catch语句会更具可读性吗?

我应该将它们放在较低级别以更高级别的Exception并且只捕获此异常吗?

And*_*ner 6

如果您需要以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.