假设这段代码在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
}
}
最佳答案
>在Java 7中,使用catch(FirstException1 | SecondException | …)
> catch可能没有问题(例外e) – 你想记录所有异常,不是吗?我实际上会建议catch(Throwable t)因为OutOfMemoryError和StackOverflowErrors也想记录.
> catch可能没有问题(例外e) – 你想记录所有异常,不是吗?我实际上会建议catch(Throwable t)因为OutOfMemoryError和StackOverflowErrors也想记录.
多年来记录异常的经验提供的建议是以相同的方式记录它们.异常消息足以作为人类可读的文本,开发人员真正需要调试的是堆栈跟踪.
只需注意一件事:永远不要过早捕获异常:在整个应用程序的单个位置捕获它们,即所谓的异常障碍 – 它位于您进入和退出工作单元的级别.
如果检查的异常在较低级别给您带来麻烦,请将它们包装到RuntimeException中:
try {
...
}
catch (RuntimeException e) {throw e;}
catch (Exception e) {throw new RuntimeException(e);}
只有当您准确且事先知道存在对您的应用程序具有业务级别含义的异常,并且不会中止当前工作单元但重定向其流程时,才能在较低级别捕获该异常.实际上,与应用程序代码抛出的所有可能异常的总和相比,这种异常很少见.