我之前从未做过任何严肃的Java编码,但我根据现有技能(Delphi和C#)学习了语法,库和概念.我很难理解的一件事是,我已经看到了这么多代码,在printStackTrace这样的情况下默默地消耗异常:
public void process() {
try {
System.out.println("test");
} catch(Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
在我遇到的几乎所有Java文章和项目中都有类似的代码.根据我的知识,这是非常糟糕的.几乎总是应该将异常转发到外部上下文,如下所示:
public void process() {
try {
System.out.println("test");
} catch(Exception e) {
e.printStackTrace();
throw new AssertionError(e);
}
}
Run Code Online (Sandbox Code Playgroud)
大多数情况下,异常最终应该在属于底层框架的最外层循环中处理(例如Java Swing).为什么Java世界中的代码看起来像这样的规范?我很困惑.
根据我的背景,我宁愿完全删除printStackTrace .我会简单地重新抛出一个未处理的aka RuntimeException(或更好的AssertionError),然后捕获并在最合适的位置记录它:框架最外层循环.
public void process() {
try {
System.out.println("test");
} catch(Exception e) {
throw new AssertionError(e);
}
}
Run Code Online (Sandbox Code Playgroud)