我希望能够阻止这样的代码进入我的代码库:
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检查,但没有找到任何东西。
答案 0 :(得分:3)
有两种开源静态分析工具,通常用于检查代码库中的不良模式:FindBugs和PMD。我快速扫描了这些工具的标准规则集,但我没有发现任何会检查你想要从代码库中消除的模式。
但是,FindBugs和PMD都允许您编写自己的自定义规则。这并不难。
除此之外:我希望这些示例“仅仅是为了说明”,并且您永远不会在实际代码中处理类似的异常。如果你这样做,(IMO)那么这比你目前关注的问题要严重得多:
抓住并投掷Exception
是一个非常糟糕的主意。当您catch
Exception
类(或Throwable
)时,您的处理程序不知道会有哪些例外情况。如果您抛出或重新抛出Exception
,封闭方法必须处理它(请参阅上一句)或在签名中声明Exception
。这使情况变得更糟。如果你不小心,这会在整个代码库中像癌症一样蔓延。
捕获异常,记录异常然后重新抛出异常也是一个坏主意。如果您不小心,将多次记录相同的异常。通常最好只在最终处理异常时记录异常。如果你总是包含堆栈跟踪,那么程序员可以获得他/她需要的所有信息来确定抛出异常的位置,源代码将告诉他/她所有精确的调用链......无需任何需要其他伐木。