捕获单独的异常或使用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);}

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

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...