我之前没有进行过任何严格的Java编程,但在已有技能(Delphi和C#)的基础上学习了语法、库和概念。但有一件事我始终难以理解,就是我看到很多代码在printStackTrace
之后静默地处理异常:
public void process() {
try {
System.out.println("test");
} catch(Exception e) {
e.printStackTrace();
}
}
几乎每个我遇到的Java文章和项目中都有类似于这样的代码。根据我的知识,这是非常糟糕的做法。异常应该几乎总是被转发到外部上下文,就像这样:
public void process() {
try {
System.out.println("test");
} catch(Exception e) {
e.printStackTrace();
throw new AssertionError(e);
}
}
大部分情况下,异常应该在属于底层框架(例如Java Swing)的最外层循环中得到处理。为什么在Java世界里编码看起来像这样是一种惯例呢?我感到困惑。基于我的背景,我更倾向于完全删除printStackTrace。我会将其重新抛出为未处理的
RuntimeException
(或者更好地说是AssertionError
),然后在最合适的位置捕获并记录日志:框架的最外层循环。 public void process() {
try {
System.out.println("test");
} catch(Exception e) {
throw new AssertionError(e);
}
}