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

前端之家收集整理的这篇文章主要介绍了捕获单独的异常或使用instanceof – Java 6前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

假设这段代码在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);}

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

猜你在找的Java相关文章