何时记录捕获的异常的堆栈跟踪

时间:2011-09-09 11:50:35

标签: java logging exception-handling

我最近问过whether to report the getMessage() text of a caught exception。相当令人惊讶的是,大多数答案误解了我的问题并认为我在询问是否报告了捕获异常的堆栈跟踪,这表明这样做被认为是常态。所以我要问一个跟进问题。

catch例外时,您应该或在不应该报告堆栈跟踪的情况下?通过“举报”,我为您添加了asking a logging framework to log the stack-trace

我不是在问是否报告某事。我在问这个报告是否应该包含堆栈跟踪。

6 个答案:

答案 0 :(得分:7)

我个人试图遵守这些规则:

  • 如果我能以'可恢复'的方式处理catch中的异常(例如DateFormatException),则无需跟踪堆栈

  • 如果我想重新抛出异常,请不记录堆栈跟踪。 (以链式方式重新抛出以保留此信息)

  • 如果我在catch块中处理异常作为错误情况(例如sql错误),我会记录堆栈跟踪。

  • 如果是运行时异常,我建议使用框架(你的或者你使用的任何东西)进行跟踪。

答案 1 :(得分:2)

它取决于上下文。例如,在解析来自外部系统的输入时,我可能不会从NumberFormat中记录/报告ParseException,但如果我捕获了处理系统边界内的数据的ParseException,我肯定会这样做,因为这表明内部系统状态不一致而不是输入值验证失败。

答案 2 :(得分:2)

- 开发人员 - 如果您遇到错误情况,则需要堆栈跟踪。因此,您需要一些方法将它从JVM中取出并发送给您。

如果您不将其记录到文件中,那么您将做什么?文件是JVM中最可靠的东西,因此在将其发送到网络之前至少应该将其放在那里。

答案 3 :(得分:0)

我通常会报告与GUI无关的异常。 GUI异常是常见的,并且在繁重的Swing程序中通常会发生。

一般来说,我对以下内容非常感兴趣:DB相关异常,My-own-stupid-errors异常(数组越界,以及类似的东西)以及其他一些我无法处理的事情,比如WebServices等

我认为这取决于系统的类型,如果它是公共的(如网站),或者它是私有的(内部网站点,GUI本地)

答案 4 :(得分:0)

堆栈跟踪对于想要调试由异常指示的错误的程序员很有用。它对其他人没有用处,方法名称和调用序列对其毫无意义,而且冗长令人分心。因此,您应该记录堆栈跟踪当且仅当且始终当异常表明程序中存在错误。但是,这并不总是表明您编写的方法应该 catch 并记录异常。在实践中,错误由未经检查的异常指示,因此让异常从方法中抛出并在更高级别处理会更容易(而且通常更好):如果您使用的是框架,它可能会记录异常您(通常带有额外的有用信息); JVM 本身可能会记录从 main 抛出的任何异常。

答案 5 :(得分:-1)

我会报告所有这些。但是如果你正在使用log4j,那么你可以控制你知道哪些,确保你不会有兴趣在日志中看到。如果特定用户异常具有不同的类,则禁用在生产中的该类中的日志记录,并在较低的环境中启用它。这样,您在代码级别没有做任何报告。它全部在日志框架中抽象出来。