Java 如何在捕获的异常上显示堆栈跟踪?
我有一个打印异常的通用函数(使用log4j): 我看到的不是堆栈跟踪,而是:Java 如何在捕获的异常上显示堆栈跟踪?,java,tomcat,stack-trace,Java,Tomcat,Stack Trace,我有一个打印异常的通用函数(使用log4j): 我看到的不是堆栈跟踪,而是: [Ljava.lang.StackTraceElement;@49af7e68 如何正确查看异常的堆栈跟踪 更新 log.error(e)返回一个s数组,因此toString方法返回数组本身的文本表示 为了实际检索堆栈跟踪信息,必须遍历每个StackTraceElement以获取更多信息。您的日志框架应该能够记录异常,因此只需将异常传递给适当的。error(Object,Throwable)调用就足够了: ja
[Ljava.lang.StackTraceElement;@49af7e68
如何正确查看异常的堆栈跟踪
更新
log.error(e)返回一个s数组,因此toString
方法返回数组本身的文本表示
为了实际检索堆栈跟踪信息,必须遍历每个
StackTraceElement
以获取更多信息。您的日志框架应该能够记录异常,因此只需将异常传递给适当的。error(Object,Throwable)
调用就足够了:
java.util.logging
字符串中使用堆栈跟踪,那么它就会变得有点困难。您必须创建一个PrintWriter
包装StringWriter
,并在异常上调用.printStackTrace()
:
StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
我用的方法是你试过了吗
private void _showErrorMessage(Exception e) {
log.error("Hey! got an exception", e);
}
你也可以看看谷歌的番石榴图书馆
Throwables.getStackTraceAsString(Throwable-Throwable)
您的问题的确切答案是您应该这样调用Log4J:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage() + ": " + e.getCause(), e);
}
虽然我不需要调用e.getCause(),因为stacktrace会将其提供给您,所以:
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage(), e);
}
如果您真的需要stacktrace的字符串,ExceptionUtils是可以的,但由于您使用的是Log4J,所以如果不使用其内置的异常处理,您会损失很多。为此显示了两种方法,一种基于Apache Commons,另一种使用标准JDK方法。当我将异常传递给log.error时,它只显示没有堆栈跟踪的错误消息。使用log4j意味着您调用了错误的版本。有error(Object)
和error(Object,Throwable)
。调用第一个版本将有效地调用toString()
@Joachim,使用log4j处理异常的方法(他提到要使用log4j)是使用log.error(String,Throwable)记录,并让log4j处理堆栈跟踪。询问者显然没有意识到这点。@Joachim,对不起。似乎log4j信息是在您回答后进行的编辑中添加的。在log4j中调用log.error(e)
会调用错误版本的方法()。此方法的JavaDoc甚至提到了这样一个事实:“警告注意,将Throwable传递给此方法将打印Throwable的名称,但不会打印堆栈跟踪。要打印堆栈跟踪,请使用error(Object,Throwable)表单。”调用日志。error(e,e)将完成此工作;)@codemonkey,你可以在你最喜欢的搜索引擎中搜索例外部分:我的答案是使用现有的库。我无法维护我发布的所有链接,所以。现在,约阿希姆的回答听起来比我的好:)请读一读。
private void _showErrorMessage(Exception e) {
log.error(e.getClass() + ": " + e.getMessage(), e);
}