Печать трассировки стека самой по себе не является плохой практикой, но только печать трассировки при возникновении исключения, вероятно, является проблемой здесь - часто просто печать трассировки стека не достаточно.
Кроме того, существует тенденция подозревать, что надлежащая обработка исключений не выполняется, если все, что выполняется в блоке catch
, является e.printStackTrace
. Неправильная обработка может означать, что в лучшем случае проблема игнорируется, а в худшем - программа, которая продолжает выполняться в неопределенном или неожиданном состоянии.
Пример
Давайте рассмотрим следующий пример:
try {
initializeState();
} catch (TheSkyIsFallingEndOfTheWorldException e) {
e.printStackTrace();
}
continueProcessingAssumingThatTheStateIsCorrect();
Здесь мы хотим выполнить некоторую обработку инициализации, прежде чем мы перейдем к некоторой обработке, которая требует, чтобы инициализация прошла.
В приведенном выше коде исключение должно было быть перехвачено и правильно обработано, чтобы предотвратить переход программы к методу continueProcessingAssumingThatTheStateIsCorrect
, который, как мы могли предположить, вызовет проблемы.
Во многих случаях e.printStackTrace()
является признаком того, что какое-то исключение проглатывается и обработка может продолжаться так, как если бы не возникало никаких проблем.
Почему это стало проблемой?
Вероятно, одна из главных причин того, что плохая обработка исключений стала более распространенной, связана с тем, что IDE, такие как Eclipse, будут автоматически генерировать код, который будет выполнять e.printStackTrace
для обработки исключений:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
(Выше приведен фактический try-catch
, автоматически сгенерированный Eclipse для обработки InterruptedException
, брошенного Thread.sleep
.)
Для большинства приложений простой печати трассировки стека к стандартной ошибке, вероятно, будет недостаточно. Неправильная обработка исключений во многих случаях может привести к тому, что приложение будет работать в непредвиденном состоянии и привести к неожиданному и неопределенному поведению.