打印堆栈跟踪与异常本身

Printing the stack trace vs the exception itself

快速提问。当然,堆栈跟踪提供了更多信息,但在某些情况下使用异常本身来代替是一种不好的做法吗?就像只是得到 "null pointer exception" 而不是这个巨大的垃圾堆?如果这没有任何意义,则两个差异将是:

(Exception e)
{
  print e
}

AND

(Exception e)
{
  e.printStackTrace
}

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

但是如果你只是问使用哪种方法,我会说后者更好,因为 System.out.println(e) 会调用 Throwable#toString 只提供这个异常的消息,也许你赢了'找出问题的真正原因。

它们之间的区别在于打印e returns 异常的类型和错误信息而printStackTrace returns 异常的整个堆栈跟踪。 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: your console 中打印结果。为了获得更好的做法,您可以查看 link:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html

这取决于上下文。任何将(甚至可能意外)呈现给用户的东西都应该 而不是 包括堆栈跟踪。除了令人困惑之外,您还可能泄露潜在的敏感信息。

在我的代码中,我创建了具有 UserFriendlyMessage 属性 的自定义异常。友好的信息应该使用非常简单的英语。我什至有一个默认的包罗万象的友好消息 "There was an unexpected problem. You can try again and if the problem continues contact support".

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

因此,总而言之,显示 仅显示友好消息,但 log(如果您要显示,alert) 完整的堆栈跟踪 + 友好的消息。