Как зайти в Даркнет?!
25th January, 01:11
4
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
893
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
912
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4380
0
Помогите пожалуйста решить задачи
24th November, 23:53
6084
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4350
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4395
0
Метода Крамера С++
23rd October, 11:55
4308
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2598
0
Каково общее правило больших пальцев для создания исключения в Java?
Я был в обеих ситуациях:
- Создание слишком большого количества пользовательских исключений
- Использование слишком большого количества общих классов исключений
В обоих случаях проект стартовал OK, но вскоре стал накладными расходами на обслуживание (и рефактор).
Итак, какова наилучшая практика создания собственных классов исключений?
Специалисты Java написали сообщение об исключениях в Java , и в нем они перечисляют несколько "best practices" для создания исключений, кратко описанных ниже:
Не пишите собственные исключения (есть много полезных исключений, которые уже являются частью Java API)
Напишите полезные исключения (если вам нужно написать свои собственные исключения, убедитесь, что они содержат полезную информацию о возникшей проблеме)
Не делайте того, что делали разработчики в моей компании. Кто-то создал [sic] InvalidArguementException, который параллелен java.lang.IllegalArgumentException, и теперь мы используем его в (буквально) сотнях классов. Оба они указывают на то, что метод был передан незаконный или неподходящий аргумент. Поговорим о расточительстве...
Джошуа блох освещает это в главе 8 " эффективное руководство по языку программирования Java " [моя Библия первой инстанции о лучших практиках]. Исключения пункт 42: отдавайте предпочтение использованию стандартных исключений . Вот немного из того, что он говорит,
Повторное использование уже существующих исключений имеет ряд преимуществ. Главным из них является то, что он делает ваш API более легким для изучения и использования, потому что он соответствует установленным соглашениям, с которыми программисты уже знакомы [ мой акцент, а не блоха ]. Во-вторых, программы, использующие ваш API, легче читать, потому что они не загромождены незнакомыми исключениями. Наконец, меньшее количество классов исключений означает меньший объем памяти и меньшее время, затрачиваемое на загрузку классов.
Наиболее часто используемым исключением является IllegalArgumentException. Это, как правило, исключение, которое нужно выбросить, когда вызывающий объект передает аргумент, значение которого является неподходящим. Например, это было бы исключение, чтобы бросить, если вызывающий передал отрицательное число в параметре, представляющем количество раз, когда некоторое действие должно было быть повторено.
Тем не менее, вы никогда не должны бросать само исключение. Java имеет хорошо подобранную, разнообразную и хорошо нацеленную группу встроенных исключений, которые охватывают большинство ситуаций AND описывают исключение, которое произошло достаточно хорошо, чтобы вы могли устранить причину.
Будьте дружелюбны к программистам, которые должны поддерживать ваш код в будущем.
Мое эмпирическое правило заключается в том, что когда клиент (вызывающий) может разумно захотеть сделать что-то другое, в зависимости от типа вызванного исключения, дополнительные типы исключений гарантируются. Однако чаще всего дополнительные типы исключений не требуются. Например, если вызывающий абонент пишет код типа
try {
doIt();
} catch (ExceptionType1 ex1) {
// do something useful
} catch (ExceptionType2 ex2) {
// do the exact same useful thing that was done in the block above
}
тогда ясно, что дополнительные типы исключений не нужны. Слишком часто я вижу (или вынужден писать) такой код, потому что вызываемый код был чрезмерно усерден в создании новых типов исключений.
В принципе, каждая работа заслуживает своего исключения. Когда вы ловите исключения, вы не различаете разные экземпляры, как это обычно делается с объектами, поэтому вам нужны разные подтипы. Использование слишком большого количества пользовательских исключений-это случай, который я вижу почти не встречающимся.
Одним из советов было бы создать исключения по мере необходимости, и если становится очевидным, что один тип исключения является дубликатом другого, рефакторинг кода путем слияния этих двух. Конечно, это помогает, если некоторые мысли идут в структурирование исключений с самого начала. Но, как правило, используйте пользовательские исключения для всех случаев, которые не имеют соответствия 1:1 существующим ситуационным исключениям.
С другой стороны, NullPointerException s и IndexOutofBoundsException s на самом деле часто могут быть подходящими. Однако не ловите их (за исключением протоколирования), поскольку они являются программной ошибкой, которая означает, что после их запуска программа находится в неопределенном состоянии.
Мое собственное эмпирическое правило:
Я никогда не бросаю исключение, за исключением юнит-тестов, когда то, что вы бросаете, не имеет значения и нет причин тратить на это дополнительное время.
Я создаю свой собственный пользовательский тип исключения для ошибок, возникающих в моей пользовательской бизнес-логике. Этот тип исключения используется в максимально возможной степени для повторной обработки других исключений, за исключением случаев, когда клиенту имеет смысл иметь видимость того, что произошло на самом деле.
В то время как создание собственных исключений:
Все исключения должны быть дочерними для класса Throwable
Если вы хотите написать проверяемое исключение, которое автоматически применяется правилом дескриптора или объявления, необходимо расширить класс исключений
Если вы хотите написать execption среды выполнения, вам необходимо расширить класс исключений среды выполнения.
Не ешьте исключения, бросьте их https://stackoverflow.com/a/921583/1097600
Избегайте создания собственного исключения. Используйте нижеприведенные, которые уже есть.
IllegalStateException
UnsupportedOperationException
IllegalArgumentException
NoSuchElementException
NullPointerException
Выбрасывайте непроверенные исключения.
Пример
public void validate(MyObject myObjectInstance) {
if (!myObjectList.contains(myObjectInstance))
throw new NoSuchElementException("object not present in list");
}