【问题标题】:Extended Exception handling扩展异常处理
【发布时间】:2016-08-04 11:15:15
【问题描述】:

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

如果我抓住了超类,有没有办法在没有长长的 if else 列表的情况下检查我已经咳嗽到覆盖方法的子类?

有几个 catch 语句会更易读吗?

我是否应该将它们在较低级别强制转换为更高级别的异常并仅捕获此异常?

【问题讨论】:

  • "没有很长的 if else 列表来检查哪个子类" 您可以使用访问者(可能)

标签: java exception error-handling


【解决方案1】:

如果您需要以特定方式处理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 来处理。

【讨论】:

  • 所以我需要先订购具有最低继承性的 catch 块,还是有办法说查看此实例的基本级别?
  • @gismo 我认为我在您发表评论时所做的编辑解决了这个问题?
猜你喜欢
  • 1970-01-01
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
相关资源
最近更新 更多