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