我希望能够阻止这样的代码 checkin 我的代码库:
catch (Exception e)
{
LOG.error( "DeleteDir of " + tempDir + " failed: " + e );
throw e;
}
这种日志记录仅记录 Exception.toString() 并且不提供运算符(operator)可能需要的其他详细信息,例如堆栈跟踪。
我想强制所有 catch-log block 执行以下操作:
catch (Exception e)
{
LOG.error( "DeleteDir of " + tempDir + " failed: " + e, e );
throw e;
}
这样我就可以根据需要将底层日志记录实现配置为详细(或不详细)。
是否有任何静态分析工具或其他策略可以做到这一点?我查找了 FindBugs 检查,但没有找到任何内容。
最佳答案
有两种开源静态分析工具通常用于检查代码库中的不良模式:FindBugs 和 PMD。我快速扫描了这些工具的标准规则集,但没有发现任何可以检查您想要从代码库中消除的模式的规则。
但是,FindBugs 和 PMD 都允许您编写自己的自定义规则。这并不难做到。
<小时/>旁白:我希望这些示例“纯粹用于说明”,并且您永远不会在实际代码中处理类似的异常。如果您这样做,(IMO)那么这就是一个比您当前关注的问题更糟糕的问题:
捕获并抛出
异常
是一个非常糟糕的主意。当您catch
Exception
类(或Throwable
)时,您的处理程序不知道会发生什么异常。如果抛出或重新抛出Exception
,则封闭方法必须处理它(请参阅上一句)或在签名中声明Exception
。这使得情况变得更糟。如果您不小心,这会像癌症一样在您的代码库中扩散。捕获异常、记录它然后重新抛出它也是一个坏主意。如果不小心,同一个异常将被记录多次。通常最好仅在最终处理异常时才记录异常。如果你总是包含堆栈跟踪,那么程序员就拥有了他/她需要找出异常抛出位置的所有信息,并且源代码将告诉他/她所有精确的调用链...而不需要其他日志记录。
关于java - 在 Java 中,如何确保捕获和记录的所有异常在我的系统中提供堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281578/