我最近开始使用声纳作为代码审查工具。当我分析运行声纳的代码时,它反映打印堆栈跟踪违反了 Java 编码标准。作为堆栈跟踪的替代方法,我尝试了:
e.getcause()
但这并没有清除堆栈跟踪所做的异常
我最近开始使用声纳作为代码审查工具。当我分析运行声纳的代码时,它反映打印堆栈跟踪违反了 Java 编码标准。作为堆栈跟踪的替代方法,我尝试了:
e.getcause()
但这并没有清除堆栈跟踪所做的异常
错误处理在任何环境中都可能很棘手,包括 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);
}
}
}
希望这可以帮助!
一些想法:
我从你使用的标题推测e.printStackTrace()
。这并没有“清除异常”,所以我不确定你的问题到底是什么。在 java 中,“清除异常”在这种情况下根本没有任何意义。
e.printStackTrace()
是“不是一个好主意”,因为它写入标准输出。将此类详细信息写入日志文件以供以后诊断要好得多,而不是将其放在用户面前(尽管这可能取决于程序的实际运行方式)。您的运行时环境可能对标准输出的使用有话要说。
e.getCause()
如果可用,将返回可能是异常的“根本原因”的“潜在异常” e
。必须堆栈跟踪将在初始堆栈转储后显示此内容,由“Caused by: : ...”表示
如果您选择尝试自己捕获和显示/记录异常 - 您可以使用e.printStackTrace(PrintStream s)
or e.printStackTrace(PrintWriter s)
。
正如 Matt 所建议的,最好使用日志工具为您服务。