为什么声纳不建议使用 e.printstacktrace() ?

use*_*034 3 java exception sonarqube

我最近开始使用声纳作为代码审查工具。当我分析运行声纳的代码时,它反映打印堆栈跟踪违反了 java 编码标准。作为堆栈跟踪的替代方案,我尝试了:

e.getcause()
Run Code Online (Sandbox Code Playgroud)

但这并没有像堆栈跟踪那样清除异常

Mat*_*arr 5

在任何环境中,错误处理都可能很棘手,包括 java。我没有使用过声纳,但我可以评论一下java错误处理的一般良好实践。

e.printStackTrace() 通常不鼓励使用,因为它只是将堆栈跟踪打印到标准错误。因此,您无法真正控制该输出的去向。

更好的做法是使用日志框架(logback、slf4j、java.util.logging、log4j 等),因为这样您就可以控制错误记录到的位置以及日志保留策略是什么。

通常,您需要捕获异常,如果这是意外行为,请将其记录下来,然后抛出一个新的异常(可能特定于您的应用程序)或执行任何您必须执行的操作以继续正常运行。

如果您使用 java.util.logging,您可以执行如下操作:

class YourClass
{
Logger logger = Logger.getLogger(YourClass.class.getName());

...

public void someMethod() throws YourException
{
  try
  {
    // your code here
  } catch (NullPointerException e)
  {
    String message = "Unexpected NullPointerException in processing!";
    logger.log(Level.ERROR, message, e);

    throw new YourException(message, e);
  }
}

}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

  • 请注意,通常建议记录异常或重新抛出异常,但不要同时执行两者。主要原因之一是调用层次结构中的下一个类几乎不可能确定异常是否已被记录。这将不可避免地导致额外的工作 - 即寻找双和三重日志条目。 (3认同)