如何在捕获的异常上显示堆栈跟踪?

时间:2010-02-11 14:34:03

标签: java tomcat stack-trace

我有一个打印异常的通用函数(使用log4j):

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage() + ": " + e.getCause() + "\n" +  e.getStackTrace().toString());
}

而不是看到我看到的堆栈跟踪:

[Ljava.lang.StackTraceElement;@49af7e68

如何正确查看异常的堆栈跟踪?

更新

log.error(e)< - 显示错误,但不显示堆栈跟踪

7 个答案:

答案 0 :(得分:68)

您的日志记录框架应该能够记录异常,因此只需将异常传递给正确的.error(Object, Throwable)调用即可:

如果您的日志记录框架无法做到这一点,或者由于任何其他原因需要String中的堆栈跟踪,那么它就会变得有点困难。您必须创建PrintWriter包裹StringWriter并在.printStackTrace()上致电Exception

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();

答案 1 :(得分:13)

你试过吗?

private void _showErrorMessage(Exception e) {
    log.error("Hey! got an exception", e);
}

答案 2 :(得分:12)

答案 3 :(得分:5)

Throwable.getStackTrace返回StackTraceElement个数组,因此toString方法返回数组本身的文本表示。

为了实际检索堆栈跟踪信息,必须通过每个StackTraceElement来获取更多信息。

答案 4 :(得分:4)

您还可以查看Google的Guava库。

Throwables.getStackTraceAsString(Throwable throwable)

答案 5 :(得分:1)

你问题的确切答案是你应该像这样调用Lo​​g4J:

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage() + ": " + e.getCause(), e);
}

虽然我会省去对e.getCause()的调用,因为无论如何堆栈跟踪都会给你,所以:

private void _showErrorMessage(Exception e) {
    log.error(e.getClass() + ": " +  e.getMessage(), e);
}

如果你真的需要一个堆栈跟踪字符串,ExceptionUtils就可以了,但是由于你使用的是Log4J,你不会因为没有利用它的内置异常处理而损失很多。

答案 6 :(得分:1)

Exception Stacktrace logging显示了两种方法,一种基于Apache Commons,另一种使用标准JDK方法。