2

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

e.getcause()

但这并没有清除堆栈跟踪所做的异常

4

2 回答 2

4

错误处理在任何环境中都可能很棘手,包括 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);
  }
}

}

希望这可以帮助!

于 2013-07-24T19:53:49.187 回答
0

一些想法:

  1. 我从你使用的标题推测e.printStackTrace()。这并没有“清除异常”,所以我不确定你的问题到底是什么。在 java 中,“清除异常”在这种情况下根本没有任何意义。

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

  3. e.getCause()如果可用,将返回可能是异常的“根本原因”的“潜在异常” e。必须堆栈跟踪将在初始堆栈转储后显示此内容,由“Caused by: : ...”表示

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

  5. 正如 Matt 所建议的,最好使用日志工具为您服务。

于 2013-07-24T19:31:40.400 回答