2013-07-24 25 views
1

我最近开始使用声纳作为代码审查工具。 当我分析我的代码运行声纳, 它反映了打印堆栈跟踪违反Java编码标准。 作为替代堆栈跟踪,我想:为什么不建议使用声纳使用e.printstacktrace()?

e.getcause() 

而是由堆栈跟踪

+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); 
    } 
} 

} 

希望这有助于!

+0

谢谢,这个解决方案很有帮助 – user2244034

+0

Level.ERROR不存在,你可能会想到SEVERE http://docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html – monksy

+1

请注意,通常建议记录异常或重新抛出异常,但不能同时抛出异常。其中一个主要原因是调用层次中的下一个类几乎不可能确定是否已经记录了异常。这将不可避免地导致额外的工作 - 即查找双重和三重日志条目。 –

0

的几点思考这样做没有清除异常:

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

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

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

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

  5. 按照Matt的建议,最好使用日志记录工具。

+0

使用> e.printStackTrace(PrintStram s) – user2244034

+0

如果> e.printStackTrace(PrintStream s)将堆栈跟踪放入日志文件中,那么它对我很有帮助。由于我使用的是Spring应用程序,因此我必须初始化PrintStream才能将堆栈跟踪记录到日志中。 – user2244034

相关问题