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

ufk*_*ufk 25 java tomcat stack-trace

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

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

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

[Ljava.lang.StackTraceElement;@49af7e68
Run Code Online (Sandbox Code Playgroud)

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

更新

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

Joa*_*uer 68

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

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

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
Run Code Online (Sandbox Code Playgroud)

  • -1 - log4j可以做到,他只是调用错误的方法. (2认同)

Pau*_*zie 14

你有没有尝试过?

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


Gui*_*ume 12

我将使用ExceptionUtils#getFullStackTraceJakarta Commons的郎

  • 断链!!! 啊,请发布答案,而不是引用其他网站. (6认同)
  • @codemonkey,您可以在自己喜欢的搜索引擎中搜索ExceptionUtils:我的答案是使用现有的库.我无法维护我在SO中发布的所有链接.现在,Joachim的答案听起来比我的好:)请阅读它. (2认同)

coo*_*ird 5

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

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