【发布时间】:2009-05-28 15:26:26
【问题描述】:
我以前从未做过任何认真的 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);
}
}
【问题讨论】:
-
我想说的是,当堆栈跟踪被打印出来时,它并不是真的很安静:)
-
我可以引用 Isaac Waller 的话“但是你的程序没有退出并继续运行,很可能处于未定义状态”
-
@willcodejavaforfood,您的评论获得了如此多的投票,这让我对典型的 Java 思维方式更加困惑。
-
@willcodejavaforfood - 从调用者的角度来看它是沉默的。来电者不知道发生了什么事。现在,如果这是预期的,那很好,但总的来说,这是个坏消息。另外 - 想想小程序中发生的事情 - 用户将永远不会看到输出(除非他们碰巧打开了 Java 控制台,但永远不会)。好的,所以没有人再使用小程序了;)虽然 servletm 类似——最终用户不知道发生了什么——它只是被隐藏在日志中。
-
Java 中的异常抛出是如此普遍,以至于大多数 Java 编码人员都忽略了它们,因为如果您进行了正确的错误捕获,那么您将需要编写更多代码......所以基本上所有这些 Java 程序员都这样做因为他们很懒惰。
标签: java exception exception-handling