Рубрики
Без рубрики

Эффективная Java: Включите информацию о сбое в Подробные сообщения

Погружение в главу 75 “Эффективная Java”. Помеченный как java, эффективный, исключения, архитектура.

Часто, когда мы анализируем сбой какого-либо кода, все, что у нас остается, – это журналы, которые остаются позади. Учитывая, что это так, мы хотим дать себе наилучшие шансы на успех. При сбое программы система автоматически выводит трассировку стека исключения, которая включает значение, возвращаемое методом toString исключения. Это сообщение служит основной возможностью для объяснения состояния системы и, в частности, исключения для будущих исследователей. Из-за этого мы должны сделать все возможное, чтобы включить любую соответствующую информацию, чтобы понять, почему система вышла из строя.

Пример, который Эффективный Java предоставляет пример Исключение IndexOutOfBoundsException . Обдумывая, какая информация может быть полезна при анализе такого сбоя, некоторые из вещей, которые могут быть полезны, – это указанная нижняя граница, верхняя граница и индекс. Располагая этими фрагментами информации, мы можем получить некоторое представление о состоянии на момент сбоя. Одно исключение из этого правила касается конфиденциальной информации. Поскольку видимость журналов часто может быть довольно далеко идущей, мы должны хранить все пароли, ключи шифрования и другую конфиденциальную информацию вне журналов и, следовательно, вне сообщений об исключениях нашего кода.

При написании метода toString мы должны сосредоточиться на предоставлении подробностей, а не на большом количестве прозы. Аудиторией сообщений журналов являются разработчики и другие инженеры, работающие над системой. Из-за этого у этих людей уже есть доступ к исходному коду и документации, и поэтому основное внимание следует уделять не этому, а скорее текущему состоянию. Иными словами, сосредоточьте свои сообщения на том, что меняется, а не на том, что остается прежним.

Лучший способ гарантировать, что эта важная информация будет предоставлена при возникновении исключения, – это запросить соответствующую информацию в конструкторе. Делая это, он гарантирует, что данные будут предоставлены. Это также позволяет вызывающему исключение не знать, как писать подробные toString сообщения. В качестве примера того, как это может выглядеть в нашем IndexOutOfBoundsException пример давайте рассмотрим следующий код:

public IndexOutOfBoundsException(int lowerBound, int higherBound, int index) {
  super(String.format("Lower bound %d, Upper bound %d, Index: %d", lowerBound, higherBound, index));

  this.lowerBound = lowerBound;
  this.higherBound = higherBound;
  this.index = index;
}

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

Предоставляя полезные подробные сообщения в исключениях, мы можем ускорить удаление и восстановление после исключений. Как это часто бывает, рассмотрение простых вещей в начале проекта может принести большие плоды при эксплуатации сервиса.

Оригинал: “https://dev.to/kylec32/effective-java-include-failure-capture-information-in-detail-messages-50ao”