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

标签 java logging exception

我希望能够阻止这样的代码 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)那么这就是一个比您当前关注的问题更糟糕的问题:

  • 捕获并抛出异常是一个非常糟糕的主意。当您catchException类(或Throwable)时,您的处理程序不知道会发生什么异常。如果抛出或重新抛出Exception,则封闭方法必须处理它(请参阅上一句)或在签名中声明Exception。这使得情况变得更糟。如果您不小心,这会像癌症一样在您的代码库中扩散。

  • 捕获异常、记录它然后重新抛出它也是一个坏主意。如果不小心,同一个异常将被记录多次。通常最好仅在最终处理异常时才记录异常。如果你总是包含堆栈跟踪,那么程序员就拥有了他/她需要找出异常抛出位置的所有信息,并且源代码将告诉他/她所有精确的调用链...而不需要其他日志记录。

关于java - 在 Java 中,如何确保捕获和记录的所有异常在我的系统中提供堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32281578/

相关文章:

java - 为什么 java ParNew 年轻代集合会通过 CMS 降级为单 CPU?

java - 为什么无法使用 system.out.println 命令打印 2 个字符

javascript - var/log/mongodb/mongod.log 从 node.js 打开和关闭连接的无限循环

logging - Log4net 创建自定义级别

c# - 如何在 ASP.NET Web Api 服务中不抛出异常?

java - 使用soot比较两个apk文件的调用图

java - Java 中的 readline() 返回 null

node.js - bunyan默认如何设置 'short'输出模式

python - 如何提高嵌套 try-except-else 子句中的代码清晰度?

c# - 测试sql连接而不抛出异常