加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

捕获单独的异常或使用instanceof – Java 6

发布时间:2020-12-15 01:04:06 所属栏目:Java 来源:网络整理
导读:假设这段代码在20个位置并且始终相同 try { // do something} catch (FirstException e) { // log it} catch (SecondException e) { // log it} 用这样的东西或者instanceof不是更好的解决办法吗? try { // do something} catch(Exception e) { logExceptio

假设这段代码在20个位置并且始终相同

try {
    // do something
} catch (FirstException e) {
    // log it
} catch (SecondException e) {
    // log it
}

用这样的东西或者instanceof不是更好的解决办法吗?

try {
    // do something
} catch(Exception e) {
    logException(e);
}

void logException(Exception e) {
    if (e instanceof FirstException) {
        // log it
    } else if (e instanceof SecondException) {
        // log it differently
    } else {
        // do something with other exception 
    }
}

我真正讨厌解决方案的唯一问题就是捕获Exception,这绝不是最好的方式……有没有更好的方法?

最佳答案
>在Java 7中,使用catch(FirstException1 | SecondException | …)
> catch可能没有问题(例外e) – 你想记录所有异常,不是吗?我实际上会建议catch(Throwable t)因为OutOfMemoryError和StackOverflowErrors也想记录.

多年来记录异常的经验提供的建议是以相同的方式记录它们.异常消息足以作为人类可读的文本,开发人员真正需要调试的是堆栈跟踪.

只需注意一件事:永远不要过早捕获异常:在整个应用程序的单个位置捕获它们,即所谓的异常障碍 – 它位于您进入和退出工作单元的级别.

如果检查的异常在较低级别给您带来麻烦,请将它们包装到RuntimeException中:

try {
  ...
} 
catch (RuntimeException e) {throw e;} 
catch (Exception e) {throw new RuntimeException(e);}

只有当您准确且事先知道存在对您的应用程序具有业务级别含义的异常,并且不会中止当前工作单元但重定向其流程时,才能在较低级别捕获该异常.实际上,与应用程序代码抛出的所有可能异常的总和相比,这种异常很少见.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读