【问题标题】:why it is not recommended to use e.printstacktrace() by sonar?为什么不建议声纳使用 e.printstacktrace()?
【发布时间】:2013-07-24 11:05:27
【问题描述】:

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

e.getcause()

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

【问题讨论】:

  • 标题/问题中的代码详细信息反映了 exact 字符,这很 critical - 您显然缺少大写字母。为了避免模棱两可的假设,请更正。

标签: java exception-handling sonarqube


【解决方案1】:

一些想法:

  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(PrintStram s)
  • 如果 >e.printStackTrace(PrintStream s) 将堆栈跟踪放在日志文件中,那么它对我有帮助。当我使用 spring 应用程序时,我必须初始化 PrintStream 仅用于将堆栈跟踪放在日志中。
【解决方案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);
  }
}

}

希望这会有所帮助!

【讨论】:

  • Level.ERROR 不存在,您可能在考虑 SEVERE docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html
  • 请注意,通常建议记录异常或重新抛出异常,但不能同时进行。主要原因之一是调用层次结构中的下一个类几乎不可能确定异常是否已被记录。这将不可避免地导致额外的工作 - 即寻找双重和三重日志条目。
猜你喜欢
  • 2020-09-19
  • 2012-05-28
  • 2013-03-11
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多