Каково общее правило для создания исключения в Java?
Я был в обеих ситуациях:
- Создание слишком большого количества пользовательских исключений
- Использование слишком большого общего класса Exception
В обоих случаях проект начал нормально, но вскоре он стал накладным для поддержки (и рефакторинга).
Итак, какова наилучшая практика создания ваших собственных классов исключений?
Ответы
Ответ 1
Специалисты по Java опубликовали сообщение о Исключения в Java, и в нем перечислены несколько "лучших практик" для создания исключений, которые приведены ниже:
-
Не записывайте собственные исключения (есть много полезных исключений, которые уже являются частью Java API)
-
Напишите полезные исключения (если вам нужно написать свои собственные Исключения, убедитесь, что они предоставляют полезную информацию о возникшей проблеме)
Ответ 2
Не делайте то, что сделали разработчики в моей компании. Кто-то создал [sic] InvalidArguementException, которое parallels java.lang.IllegalArgumentException, и теперь мы используем его (буквально) сотен классов. Оба указывают, что метод был принят незаконным или несоответствующим аргументом. Разговор об отходах...
Джошуа Блох рассказывает об этом в "Руководстве по эффективному Java-программированию" [моя библия о первом обращении к лучшим практикам] Глава 8. Исключения Пункт 42: Благоприятствуйте использованию стандартных исключений. Здесь немного того, что он говорит,
Повторное использование существующих исключений имеет несколько преимуществ. Главный из них, это упрощает изучение и использование вашего API, потому что он соответствует установленным соглашениям, с которыми программисты уже знакомы [мой акцент, а не Блоха]. Ближайшим вторым является то, что программы, использующие ваш API, легче читать, потому что они не загромождают незнакомых исключений. Наконец, меньшее количество классов исключений означает меньшую площадь памяти и меньшее время, затрачиваемое на загрузку классов.
Наиболее часто используемым исключением является исключение IllegalArgumentException. Это, как правило, исключение для того, чтобы выбросить, когда вызывающий абонент передает аргумент, значение которого неуместно. Например, это было бы исключение для броска, если вызывающий абонент передал отрицательное число в параметре, представляющем количество повторений некоторого действия.
Тем не менее, вы должны никогда бросать исключение. Java имеет хорошо подобранную, разнообразную и целенаправленную совокупность встроенных исключений, которые охватывают большинство ситуаций И, описывают исключение, которое произошло достаточно хорошо, чтобы вы могли исправить причину.
Будьте дружелюбны к программистам, которые должны поддерживать ваш код в будущем.
Ответ 3
Мое эмпирическое правило - когда клиент (вызывающий) может разумно хотеть делать что-то другое, в зависимости от типа брошенного исключения, дополнительные типы исключений являются оправданными. Однако чаще всего дополнительные типы исключений не нужны. Например, если вызывающий абонент пишет код типа
try {
doIt();
} catch (ExceptionType1 ex1) {
// do something useful
} catch (ExceptionType2 ex2) {
// do the exact same useful thing that was done in the block above
}
то, очевидно, дополнительные типы исключений не нужны. Слишком часто я вижу (или вынужден писать) код так, потому что вызываемый код был чрезмерно усердным в создании новых типов исключений.
Ответ 4
Если я не могу найти исключение, у которого есть имя, описывающее, какой тип ошибки был вызван, я делаю свой собственный.
Это мое правило-o-thumb.
Ответ 5
В принципе, каждое задание заслуживает собственного исключения. Когда вы перехватываете исключения, вы не различаете разные экземпляры, например, вы обычно делаете с объектами, поэтому вам нужны разные подтипы. Использование слишком большого количества пользовательских исключений - это случай, который я вижу едва ли.
Одним из советов было бы создание исключений по мере необходимости, и если станет очевидным, что один тип исключения является дубликатом другого, реорганизуйте его, объединив два. Конечно, это помогает, если подумать о том, чтобы с самого начала было структурировать исключения. Но обычно используйте пользовательские исключения для всех случаев, которые не имеют соответствия 1:1 существующим исключениям для конкретной ситуации.
С другой стороны, NullPointerException
и IndexOutofBoundsException
могут часто быть подходящими. Не поймайте их, хотя (за исключением регистрации), поскольку они являются ошибкой программирования, что означает, что после их броска программа находится в состоянии undefined.
Ответ 6
Мое собственное правило:
Я никогда не бросаю исключение, за исключением модульных тестов, когда то, что вы бросаете, не имеет значения, и нет причин тратить на него дополнительное время.
Я создаю свой собственный тип исключения для ошибок, возникающих в моей пользовательской бизнес-логике. Этот тип исключения используется как можно больше для повторного использования других исключений, за исключением случаев, когда для клиента имеет смысл видеть, что на самом деле произошло.
Ответ 7
При создании собственного исключения:
-
Все исключения должны быть дочерними элементами Throwable Class
-
Если вы хотите написать проверенное исключение, которое автоматически принудительно выполняется с помощью правила Handle или Declare Rule, вам необходимо расширить класс исключений
-
Если вы хотите написать исполняемый файл во время выполнения, вам необходимо расширить класс исключения Runtime.