快速提问。当然,堆栈跟踪会提供更多信息,但在某些情况下使用异常本身是一种不好的做法吗?就像刚刚获得"空指针异常"而不是这个巨大的东西?如果这没有任何意义,那么两个不同之处是:
(Exception e)
{
print e
}
AND
(Exception e)
{
e.printStackTrace
}
答案 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