Как отобразить трассировку стека при обнаружении исключения? - PullRequest
24 голосов
/ 11 февраля 2010

У меня есть общая функция, которая печатает исключения (используя 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) <- показывает ошибку, но не показывает трассировку стека </p>

Ответы [ 7 ]

68 голосов
/ 11 февраля 2010

Ваша структура ведения журналов должна иметь возможность регистрировать исключения, поэтому достаточно просто передать исключение на правильный вызов .error(Object, Throwable):

Если ваша структура ведения журналов не может этого сделать или вам нужна трассировка стека в String по любой другой причине, тогда это становится немного сложнее. Вам нужно будет создать PrintWriter обертку StringWriter и вызвать .printStackTrace() на Exception:

StringWriter sw = new StringWriter();
ex.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
13 голосов
/ 11 февраля 2010

Вы пробовали?

private void _showErrorMessage(Exception e) {
    log.error("Hey! got an exception", e);
}
12 голосов
/ 11 февраля 2010
5 голосов
/ 11 февраля 2010

Throwable.getStackTrace возвращает массив StackTraceElement с, следовательно, метод toString возвращает текстовое представление самого массива.

Чтобы действительно получить информацию о трассировке стека, нужно пройти каждый StackTraceElement, чтобы получить больше информации.

4 голосов
/ 11 февраля 2010

Вы также можете посмотреть библиотеки Guava от Google.

Throwables.getStackTraceAsString(Throwable throwable)

1 голос
/ 25 января 2014

Ведение журнала стека исключений показывает два метода для этой цели, один на основе Apache Commons, а другой с использованием стандартного метода JDK.

1 голос
/ 12 февраля 2010

Точный ответ на ваш вопрос заключается в том, что вы должны называть Log4J следующим образом:

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, вы теряете много, не используя встроенную обработку исключений.

...