在Java中,如何确保捕获和记录的所有异常在我的系统中提供堆栈跟踪?

时间:2015-08-29 00:45:16

标签: java logging exception-handling

我希望能够阻止这样的代码进入我的代码库:

catch (Exception e)
{
   LOG.error( "DeleteDir of " + tempDir + " failed: " + e );
   throw e;
}

此类日志记录仅记录Exception.toString(),并且不提供运营商可能需要的其他详细信息,例如堆栈跟踪。

我想强制执行所有catch-log块来执行以下操作:

catch (Exception e)
{
   LOG.error( "DeleteDir of " + tempDir + " failed: " + e, e );
   throw e;
}

这样我可以根据需要将基础日志记录实现配置为详细(或不是)。

是否有任何静态分析工具或其他策略可以执行此操作?我找了一个FindBugs检查,但没有找到任何东西。

1 个答案:

答案 0 :(得分:3)

有两种开源静态分析工具,通常用于检查代码库中的不良模式:FindBugs和PMD。我快速扫描了这些工具的标准规则集,但我没有发现任何会检查你想要从代码库中消除的模式。

但是,FindBugs和PMD都允许您编写自己的自定义规则。这并不难。

除此之外:我希望这些示例“仅仅是为了说明”,并且您永远不会在实际代码中处理类似的异常。如果你这样做,(IMO)那么这比你目前关注的问题要严重得多:

  • 抓住并投掷Exception是一个非常糟糕的主意。当您catch Exception类(或Throwable)时,您的处理程序不知道会有哪些例外情况。如果您抛出或重新抛出Exception,封闭方法必须处理它(请参阅上一句)或在签名中声明Exception。这使情况变得更糟。如果你不小心,这会在整个代码库中像癌症一样蔓延。

  • 捕获异常,记录异常然后重新抛出异常也是一个坏主意。如果您不小心,将多次记录相同的异常。通常最好只在最终处理异常时记录异常。如果你总是包含堆栈跟踪,那么程序员可以获得他/她需要的所有信息来确定抛出异常的位置,源代码将告诉他/她所有精确的调用链......无需任何需要其他伐木。