繁体   English   中英

打印堆栈跟踪与异常本身

[英]Printing the stack trace vs the exception itself

快速提问。 当然,堆栈跟踪会提供更多信息,但是在某些情况下使用异常本身是一种不好的做法吗? 就像只是获取“空指针异常”而不是大量的东西一样? 如果这没有任何意义,则两个区别将是:

(Exception e)
{
  print e
}

AND

(Exception e)
{
  e.printStackTrace
}

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

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

这取决于上下文。 将(甚至可能会不小心)呈现给用户的内容不应包括堆栈跟踪。 您不仅可能混淆,还可能泄漏潜在的敏感信息。

在我的代码中,我创建了具有UserFriendlyMessage属性的自定义异常。 友好的消息应使用非常简单的英语。 我什至还有一条默认的全面提示信息“出现了意外问题。您可以重试,如果问题仍然存在,请联系支持部门”

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

因此,总而言之,仅显示友好消息,但记录 (如果需要,则发出警报 )完整的堆栈跟踪+友好消息。

它们之间的区别在于,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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM