我最近开始使用声纳作为代码审查工具。 当我分析运行声纳的代码时, 它反映了打印堆栈跟踪违反了java编码标准。 作为堆栈跟踪的替代方法,我尝试了:
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);
}
}
}
希望这有帮助!
答案 1 :(得分:0)
一些想法:
我从您使用e.printStackTrace()
的标题中推测出来。这样做不“清除异常”,所以我不确定你的问题究竟是什么。在java中,“clear the exception”在这种情况下根本没有任何意义。
e.printStackTrace()
“不是一个好主意”因为它写入标准输出。将这样的细节写入日志文件以便以后进行诊断要好得多,而不是将其放在用户面前(尽管这可能取决于程序实际运行的方式)。您的运行时环境可能对标准输出的使用有所说明。
e.getCause()
将返回“基础异常”(如果可用),该异常可能是异常e
的“根本原因”。必须堆栈跟踪将在由“引起:: ...”
如果您选择尝试自行捕获并显示/记录异常,则可以使用e.printStackTrace(PrintStream s)
或e.printStackTrace(PrintWriter s)
。
按照Matt的建议,您最好使用日志工具。