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

i86rm4rw  于 2023-06-21  发布在  其他
关注(0)|答案(7)|浏览(202)

我有一个打印异常的通用函数(使用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)〈-显示错误,但不显示堆栈跟踪

46scxncf

46scxncf1#

您的日志框架应该能够记录异常,因此只需将异常传递给适当的.error(Object, Throwable)调用就足够了:

如果你的日志框架不能做到这一点,或者你需要在String中进行堆栈跟踪,那么这就有点困难了,你必须创建一个PrintWriter来 Package StringWriter,并在Exception上调用.printStackTrace()

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

a1o7rhls2#

你试过吗?

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

s1ag04yj3#

我使用Jakarta Commons Lang的ExceptionUtils#getFullStackTrace方法

dy1byipe

dy1byipe4#

Throwable.getStackTrace返回StackTraceElement的数组,因此toString方法返回数组本身的文本表示。
为了实际检索堆栈跟踪信息,必须遍历每个StackTraceElement以获得更多信息。

k2fxgqgv

k2fxgqgv5#

你也可以从谷歌上查看Guava库。
Throwables.getStackTraceAsString(Throwable throwable)

enxuqcxy

enxuqcxy6#

您的问题的确切答案是,您应该这样调用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,如果不利用它内置的异常处理,您会损失很多。

hsvhsicv

hsvhsicv7#

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

相关问题