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

use*_*882 5 java exception-handling instanceof

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

try {
    // do something
} catch (FirstException e) {
    // log it
} catch (SecondException e) {
    // log it
}
Run Code Online (Sandbox Code Playgroud)

使用这样的东西或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 
    }
}
Run Code Online (Sandbox Code Playgroud)

我真正讨厌解决方案的唯一方法就是抓住Exception哪个定义不是最好的方式......有没有更好的方法?

Mar*_*nik 9

  1. 在Java 7中,使用 catch (FirstException1 | SecondException | ...)
  2. 可能没有任何问题catch (Exception e)- 你想记录所有异常,不是吗?我实际上会建议,catch (Throwable t)因为OutOfMemoryErrors和StackOverflowErrors也想要记录.

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

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

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

try {
  ...
} 
catch (RuntimeException e) {throw e;} 
catch (Exception e) {throw new RuntimeException(e);}
Run Code Online (Sandbox Code Playgroud)

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

  • 是不是像所有人中最大的罪恶一样抓住了Throwable?因为我不想抓住所有例外......只是两个 (2认同)