Сейчас я пишу новый код и уделяю очень пристальное внимание тому, как я работаю с исключениями. Я пытаюсь увидеть точку зрения толпы «нам не нравятся проверенные исключения», но до сих пор не вижу ее.
Каждый мой разговор заканчивается одним и тем же вопросом, остающимся без ответа... позвольте мне задать его:
В общем (на основе того, как был разработан Java),
- предназначен для вещей, которые никогда не следует ловить (у ВМ аллергия на арахис, и кто-то уронил на нее банку с арахисом)
Код: Выделить всё
Error - предназначен для действий, которые программист сделал неправильно (программист отошел от конца массива)
Код: Выделить всё
RuntimeException - (кроме RuntimeException) предназначен для вещей, которые находятся вне контроля программиста (диск заполняется во время записи в файловую систему, достигнут предел дескриптора файла для процесса, и вы не можете больше открывать файлы)
Код: Выделить всё
Exception - — это просто родительский элемент всех типов исключений.
Код: Выделить всё
Throwable
Другой распространенный аргумент, который я слышу, заключается в том, что проверенные исключения затрудняют рефакторинг кода.
Для аргумента «все, что я собираюсь сделать, это выйти» Я говорю, что даже если вы выходите, вам необходимо отобразить разумное сообщение об ошибке. Если вы просто делаете ставку на обработку ошибок, то ваши пользователи не будут слишком счастливы, когда программа завершится без четкого указания причины.
Для людей, которые говорят, что рефакторинг затрудняется, это означает, что не был выбран правильный уровень абстракции. Вместо того, чтобы объявлять метод, выбрасывающий IOException, IOException должен быть преобразован в исключение, которое больше подходит для происходящего.
У меня нет проблем с обертыванием Main с помощью catch(Exception) (или в некоторых случаях catch(Throwable), чтобы гарантировать корректный выход из программы, но я всегда перехватываю те конкретные исключения, которые мне нужны. Это позволяет мне, по крайней мере, отобразите соответствующее сообщение об ошибке.
Вопрос, на который люди никогда не отвечают, заключается в следующем:
Если вы генерируете подклассы RuntimeException
вместо подклассов Exception
, то как вы узнаете, что
вы должны перехватить?
Если ответ — перехват исключения, то вы также имеете дело с ошибками программиста так же, как и с системными исключениями. Мне это кажется неправильным.
Если вы ловите Throwable, то вы обрабатываете системные исключения и ошибки виртуальной машины (и тому подобное) одинаково. Мне это кажется неправильным.
Если ответ таков: вы ловите выбрасываются только те исключения, которые вам известны, тогда откуда вы знаете, какие именно? Что произойдет, если программист X выдаст новое исключение и забудет его перехватить? Мне это кажется очень опасным.
Я бы сказал, что программа, отображающая трассировку стека, неверна. Разве люди, которым не нравятся проверенные исключения, не так думают?
Итак, если вам не нравятся проверенные исключения, можете ли вы объяснить, почему бы и нет, И ответить на вопрос? вопрос, на который нет ответа, пожалуйста?
Я не ищу советов о том, когда использовать ту или иную модель, я ищу, почему люди расширяют возможности RuntimeException, потому что им не нравится расширяться из Exception и/или почему они перехватывают исключение, а затем повторно вызывают RuntimeException, а не добавляют броски в свой метод. Хочу понять мотивацию нелайка проверенного исключения.
Подробнее здесь: https://stackoverflow.com/questions/613 ... exceptions
Мобильная версия