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

Рекомендации по распространению исключений (на Java)

Существуют ли какие-либо рекомендации по распространению исключений в Java?

Когда вы добавляете исключение из подписи метода? Например: если исключение возникает только при отсутствии основного ресурса программы и может обрабатываться только на верхнем уровне, распространяю ли я его с помощью всех методов, используя это исключение, всеми методами, использующими метод ошибок?

Есть ли хорошие практики? Любые плохие практики?

Извините, если я расплывчатый, но я просто ищу некоторые (общие) советы по стилю программирования, касающиеся исключений.

4b9b3361

Ответ 1

Рекомендации, которые помогли мне в прошлом, включают:

  • Выбрасывать исключения, когда метод не может обрабатывать исключение, и, что более важно, должен обрабатываться вызывающим. Хорошим примером этого является присутствие в Servlet API - doGet() и doPost() throw ServletException или IOException при определенных обстоятельствах, когда запрос не может быть правильно прочитан. Ни один из этих методов не способен обрабатывать исключение, но контейнер (в большинстве случаев это приводит к ошибке страницы 50x).
  • Пустить исключение, если метод не может его обработать. Это является следствием вышеизложенного, но применимо к методам, которые должны улавливать исключение. Если пойманное исключение не может быть обработано корректно с помощью метода, тогда предпочтительнее его пузырь.
  • Внесите исключение прямо сейчас. Это может показаться расплывчатым, но если встречается сценарий исключения, то хорошей практикой является исключение, указывающее исходную точку отказа, вместо попытки обработки отказа с помощью кодов ошибок до тех пор, пока точка, считающаяся подходящей для исключения исключения, Другими словами, попытка минимизировать обработку исключений с обработкой ошибок.
  • Либо регистрируйте исключение, либо пузырь, но не выполняйте оба. Регистрация исключения часто указывает на то, что стек исключений был полностью размотан, что указывает на то, что никакого последующего барботажа исключения не произошло. Следовательно, не рекомендуется делать оба одновременно, так как это часто приводит к разочаровывающему опыту в отладке.
  • Использовать подклассы java.lang.Exception (проверенные исключения), если вы за исключением вызывающего обработчика исключения. Это приводит к тому, что компилятор выдает сообщение об ошибке, если вызывающий объект не обрабатывает исключение. Остерегайтесь, однако, это обычно приводит к тому, что разработчики "глотают" исключения в коде.
  • Используйте подклассы java.lang.RuntimeException (исключенные исключения) для ошибок программирования сигналов. Рекомендуемые здесь классы исключений включают IllegalStateException, IllegalArgumentException, UnsupportedOperationException и т.д. Опять же, нужно быть осторожным в использовании классов исключений, таких как NullPointerException (почти всегда плохая практика бросить).
  • Использовать иерархии классов исключений для передачи информации об исключениях по различным уровням. Внедряя иерархию, вы можете обобщить поведение обработки исключений в вызывающем. Например, вы можете использовать исключение root, такое как DomainException, которое имеет несколько подклассов, таких как InvalidCustomerException, InvalidProductException и т.д. Здесь предостережение заключается в том, что ваша иерархия исключений может взорваться очень быстро, если вы представляете каждый отдельный исключительный сценарий как отдельное исключение.
  • Избегайте перехвата исключений, с которыми вы не можете справиться. Довольно очевидно, но многие разработчики пытаются поймать java.lang.Exception или java.lang.Throwable. Поскольку все подклассифицированные исключения могут быть пойманы, поведение во время выполнения приложения часто может быть неопределенным при попадании "глобальных" классов исключений. В конце концов, не хотелось бы ловить OutOfMemoryError - как следует обрабатывать такое исключение?
  • Завершить исключения с осторожностью. Повторное создание исключения сбрасывает стек исключений. Если исходная причина не была предоставлена ​​новому объекту исключения, он потерян навсегда. Чтобы сохранить стек исключений, нужно будет предоставить исходный объект исключения новому конструктору исключения.
  • Преобразовать проверенные исключения в неконтролируемые только при необходимости. При обертке исключения можно обернуть проверенное исключение и выбросить непроверенный. Это полезно в некоторых случаях, особенно когда целью является прервать текущий исполняемый поток. Однако в других сценариях это может вызвать немного боли, поскольку проверки компилятора не выполняются. Поэтому адаптация проверенного исключения как неконтролируемого не предназначена для слепого.

Ответ 2

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

Плохая практика об исключении - это поймать их всех (это не покемон, это java!), поэтому избегайте catch(Exception e) или хуже catch(Throwable t).