Исключение печати vs Exception.getMessage

Существует ли наилучшая практика использования двух частей кода, касающихся исключений.

//code1

} catch (SomeException e) {
    logger.error("Noinstance available!", e.getMessage());
}

//code2
} catch (SomeException e) {
    logger.error("Noinstance available!", e);
}

Когда следует использовать метод getMessage для исключения?

Ответ 1

Первый не компилируется, потому что метод error принимает в качестве первого параметра a String и a Throwable.

e.getMessage() не является Throwable.

Код должен быть

} catch (SomeException e) {
    // No stack trace
    logger.error("Noinstance available! " + e.getMessage());
}

По сравнению с

} catch (SomeException e) {
    // Prints message and stack trace
    logger.error("Noinstance available!", e);
}

Первое выводит только сообщение. Второй отпечаток также содержит всю трассировку стека.

Это зависит от контекста, если необходимо распечатать трассировку стека или нет.

Если вы уже знаете, почему может быть выбрано исключение, не рекомендуется печатать всю трассировку стека.

Если вы не знаете, лучше распечатать всю трассу strack, чтобы легко найти ошибку.

Ответ 2

Этот прототип полезен, если вы классифицируете исключение в Бизнес уровне и Техническое исключение.

Для исключения бизнес-уровня вы просто используете сообщение, регистрируясь аналитика или можете отображать на экране информацию о значении (что-то не работает).

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

Ответ 3

Это зависит от того, нужна ли трассировка стека исходного исключения (SomeException). Если да, то код 2 является правильным вариантом. Обратите внимание, что это более распространенный способ обработки этих ситуаций.

Если вас не интересует исходное исключение, вы можете использовать code1, но это неверно. Поскольку отправленный вами код принимает сообщение как аргумент. Итак, правильный способ:

logger.error("Noinstance available! - reason:" + e.getMessage());

Ответ 4

С помощью stacktrace:

logger.error("Could not do XYZ because of: " + ex, ex);

Без stacktrace:

logger.error("Could not do XYZ because of: " + ex);

Ответ 5

Exception.printStackTrace() не следует использовать, если вы, например, не отлаживаете отладку.

Для ведения журнала, безусловно, лучше использовать Exception.getMessage(). Также обратите внимание, что многие фреймворки ведения журнала (например, Log4j) принимают исключение как self как аргумент метода ведения журнала (например, error()) и сами его разрабатывают.

Ответ 6

Вы можете попробовать следующее: -

logger.error(e.getMessage(), e);

Он возвращает строчную строку сообщения этого броска.

logger.error(e.getLocalizedMessage(),e);

Создает локализованное описание этого throwable. Подклассы могут переопределять этот метод для создания сообщения, специфичного для локали. Для подклассов, которые не переопределяют этот метод, реализация по умолчанию возвращает тот же результат, что и getMessage().

В вашем случае e - ничего, кроме объекта исключения...

getLocalizedMessage() u необходимо переопределить и дать собственное сообщение, то есть значение для локализованного сообщения.