В течение ряда лет мне не удалось получить достойный ответ на следующий вопрос: почему некоторые разработчики так против проверенных исключений? У меня было много разговоров, читайте в блогах, читайте, что должен был сказать Брюс Эккель (первый человек, которого я видел, высказывался против них).
В настоящее время я пишу какой-то новый код и уделяю очень пристальное внимание тому, как я занимаюсь исключениями. Я пытаюсь увидеть точку зрения группы "Мы не любим проверенные исключения", и я до сих пор не вижу ее.
В каждом разговоре у меня заканчивается тот же вопрос, который остается без ответа... позвольте мне настроить его:
В целом (из того, как была разработана Java),
- Ошибка для вещей, которые никогда не должны быть пойманы (у VM есть арахисная аллергия, и кто-то сбросил на нее банку арахиса)
- RuntimeException - это то, что программист сделал неправильно (программист ушел с конца массива)
- Исключение (исключая RuntimeException) для вещей, которые находятся вне контроля программиста (диск заполняется во время записи в файловую систему, ограничение на дескриптор файла для процесса было достигнуто, и вы больше не можете открывать файлы)
- Throwable - это просто родительский тип всех типов исключений.
Общепринятый аргумент, который я слышу, состоит в том, что если исключение происходит, то все разработчики собираются сделать это, выйдите из программы.
Другим распространенным аргументом, который я слышу, является то, что проверенные исключения затрудняют рефакторинг.
Для аргумента "все, что я хочу сделать, это exit", я говорю, что даже если вы выходите, вам нужно отобразить разумное сообщение об ошибке. Если вы просто пишете ошибки при обработке, ваши пользователи не будут слишком счастливы, когда программа выйдет без четкого указания на то, почему.
Для толпы "он трудно реорганизовать", это означает, что правильный уровень абстракции не выбран. Вместо того, чтобы объявлять, что метод генерирует исключение IOException, IOException следует преобразовать в исключение, которое больше подходит для того, что происходит.
У меня нет проблемы с wrapping Main с catch (Exception) (или в некоторых случаях catch (Throwable), чтобы гарантировать, что программа может выйти изящно - но я всегда поймаю конкретные исключения, которые мне нужны. мне, по крайней мере, отобразить соответствующее сообщение об ошибке.
Вопрос, на который люди никогда не отвечают, таков:
Если вы выбрали RuntimeException подклассы вместо исключения подклассы, то откуда вы знаете, что вы должны поймать?
Если ответ является catch Exception, вы также имеете дело с ошибками программиста так же, как и системные исключения. Это кажется мне неправильным.
Если вы поймаете Throwable, вы будете обрабатывать системные исключения и ошибки VM (и тому подобное) таким же образом. Это кажется мне неправильным.
Если ответ заключается в том, что вы поймаете только те исключения, которые, как вы знаете, выбрасываются, то откуда вы знаете, что их бросают? Что происходит, когда программист X выдает новое исключение и забыл его поймать? Это кажется мне очень опасным.
Я бы сказал, что программа, отображающая трассировку стека, неверна. Неужели люди, которые не любят проверенные исключения, не чувствуют себя так?
Итак, если вам не нравятся проверенные исключения, вы можете объяснить, почему нет И ответить на вопрос, на который не ответили, пожалуйста?
Изменить: я не ищу советы о том, когда использовать любую модель, то, что я ищу, - это то, почему люди распространяются из RuntimeException, потому что им не нравится распространяться от Exception и/или почему они поймают исключение, а затем реконструируют RuntimeException, а не добавлять броски к их методу. Я хочу понять мотивацию неправедных проверенных исключений.