为什么不推荐使用声纳的e.printstacktrace()?

时间:2013-07-24 19:22:43

标签: java exception-handling sonarqube

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

e.getcause()

但是这并没有清除堆栈跟踪

所做的异常

2 个答案:

答案 0 :(得分:2)

在包含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);
  }
}

}

希望这有帮助!

答案 1 :(得分:0)

一些想法:

  1. 我从您使用e.printStackTrace()的标题中推测出来。这样做“清除异常”,所以我不确定你的问题究竟是什么。在java中,“clear the exception”在这种情况下根本没有任何意义。

  2. e.printStackTrace()“不是一个好主意”因为它写入标准输出。将这样的细节写入日志文件以便以后进行诊断要好得多,而不是将其放在用户面前(尽管这可能取决于程序实际运行的方式)。您的运行时环境可能对标准输出的使用有所说明。

  3. e.getCause()将返回“基础异常”(如果可用),该异常可能是异常e的“根本原因”。必须堆栈跟踪将在由“引起:: ...”

  4. 表示的初始堆栈转储后显示此信息
  5. 如果您选择尝试自行捕获并显示/记录异常,则可以使用e.printStackTrace(PrintStream s)e.printStackTrace(PrintWriter s)

  6. 按照Matt的建议,您最好使用日志工具。