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

3

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

e.getcause()

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

2
非常重要的是,您标题/问题中的代码细节必须反映出确切的字符 - 您明显缺少大写字母。为了避免模棱两可的假设,请进行更正。 - Richard Sitze
2个回答

5
错误处理在任何环境中都很棘手,包括Java。我不熟悉Sonar,但我可以评论一下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);
  }
}

}

希望这能有所帮助!

Level.ERROR不存在,您可能在想SEVERE。请参考http://docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html。 - monksy
3
请注意,通常建议要么记录异常,要么重新抛出异常,但不要同时进行。主要原因之一是,调用层次结构中的下一个类几乎无法确定异常是否已经被记录。这必然会导致额外的工作——即查找双重和三重日志条目。 - Priidu Neemre

0

几点想法:

  1. 我从标题中推断出您正在使用 e.printStackTrace()。这不会“清除异常”,因此我不确定您在这一点上的问题实际上是什么。在Java中,“清除异常”在这种情况下根本没有任何意义。

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

  3. e.getCause()将返回,如果可用,可能是导致异常e的“根本原因”的“基础异常”。大多数堆栈跟踪将在“Caused by: ...”之后显示此初始堆栈转储。

  4. 如果您选择尝试自己捕获和显示/记录异常-您可以使用e.printStackTrace(PrintStream s)e.printStackTrace(PrintWriter s)

  5. 最好使用日志工具,如Matt所建议的。


使用 >e.printStackTrace(PrintStream s) - user2244034
如果>e.printStackTrace(PrintStream s)将堆栈跟踪放入日志文件中,那对我会很有帮助。由于我正在使用Spring应用程序,因此我必须仅初始化PrintStream以将堆栈跟踪放入日志中。 - user2244034

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接