打印堆栈跟踪与异常本身

时间:2015-11-07 19:11:14

标签: java exception stack-trace

快速提问。当然,堆栈跟踪会提供更多信息,但在某些情况下使用异常本身是一种不好的做法吗?就像刚刚获得"空指针异常"而不是这个巨大的东西?如果这没有任何意义,那么两个不同之处是:

(Exception e)
{
  print e
}

AND

(Exception e)
{
  e.printStackTrace
}

3 个答案:

答案 0 :(得分:6)

我会说在生产中不使用它们。您应该以其他方式处理异常,例如记录异常或将堆栈跟踪保存到某处以便稍后查看,并且可能向用户显示一条消息,说明应用程序或方法失败。

但是,如果您只是询问使用哪种方法,我会说后者更好,因为System.out.println(e)会调用Throwable#toString只提供此异常的消息,也许您赢了&#39得到问题的真正原因。

答案 1 :(得分:2)

这取决于具体情况。任何将(甚至可能意外)呈现给用户的内容都应该包括堆栈跟踪。您可能会泄漏潜在的敏感信息,而不仅仅是令人困惑。

在我的代码中,我创建了具有UserFriendlyMessage属性的自定义异常。友情信息应该是非常简单的英语。我甚至有一个默认的全友好消息"出现了意想不到的问题。您可以再试一次,如果问题仍然存在,请联系支持部门

另一方面,拥有堆栈跟踪对于调试非常有用。在我的.NET应用程序中,我们甚至以特殊方式编译我们的发布代码,以便优化代码,但符号仍然在单独的文件中生成。我们这样做的唯一目的是确保带有行号的完整堆栈跟踪。

总而言之,显示只有友好的消息,但 log (如果你打算,提醒)完整的堆栈跟踪+友好的消息。

答案 2 :(得分:1)

它们之间的区别在于print e返回异常和错误消息的类型,而printStackTrace返回异常的整个堆栈跟踪。 printStackTrace在调试时更有用。

示例:

打印e:

java.lang.IndexOutOfBoundsException

e.printStackTrace():

java.lang.IndexOutOfBoundsException: Index: 8, Size: 0
    at java.util.ArrayList.RangeCheck(ArrayList.java:547)
    at java.util.ArrayList.get(ArrayList.java:322)
    at com.o2.business.util.Trial.test(CommonUtilsTest.java:866)

printStackTrace可能对程序员有好处,但它对最终用户来说不易阅读且对用户友好。据我所知,printStackTrace在默认的Errorstream中输出结果:你的控制台。有关更好的做法,您可以查看链接:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html