何时记录捕获的exception的堆栈跟踪

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

catchexception时,您应该或者不应该在哪种情况下报告堆栈跟踪? 通过“报告”,我包括要求日志框架为您记录堆栈跟踪 。

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

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

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

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

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

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

  • 如果它是一个运行时exception,我会建议框架(你的或你使用的任何东西)进行跟踪。

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

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

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

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

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

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