Подтвердить что ты не робот

Как отобразить трассировку стека по исключенному исключению?

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

4b9b3361

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

Throwables.getStackTraceAsString(Throwable throwable)

Ответ 6

Точный ответ на ваш вопрос заключается в том, что вы должны вызвать 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);
}

ExceptionUtils отлично подходит, если вам действительно нужна строка stacktrace, но поскольку вы используете Log4J, вы теряете много, не используя встроенную обработку исключений.

Ответ 7

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