Дело против проверенных исключений - PullRequest
418 голосов
/ 05 марта 2009

В течение ряда лет я не мог получить достойный ответ на следующий вопрос: почему некоторые разработчики так против проверенных исключений? У меня было много разговоров, читал что-то в блогах, читал то, что говорил Брюс Экель (первый человек, которого я видел, выступал против них).

В настоящее время я пишу новый код и уделяю очень пристальное внимание тому, как я работаю с исключениями. Я пытаюсь увидеть точку зрения толпы «нам не нравятся проверенные исключения», и я до сих пор не вижу ее.

Каждый мой разговор заканчивается тем, что один и тот же вопрос остается без ответа ... позвольте мне настроить его:

В целом (из того, как был разработан Java),

  • Ошибка для вещей, которые никогда не должны быть пойманы (у ВМ аллергия на арахис, и кто-то уронил на нее банку с арахисом)
  • RuntimeException для вещей, которые программист сделал неправильно (программист ушел с конца массива)
  • Исключение (кроме RuntimeException) относится к вещам, которые находятся вне контроля программиста (диск заполняется при записи в файловую систему, достигнут предел дескриптора файла для процесса, и вы больше не можете открывать файлы)
  • Throwable - это просто родитель всех типов исключений.

Распространенный аргумент, который я слышу, заключается в том, что если произойдет исключение, то все, что разработчик собирается сделать, - это выйти из программы.

Другой распространенный аргумент, который я слышу, заключается в том, что проверенные исключения затрудняют рефакторинг кода.

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

Для толпы "это затрудняет рефакторинг", что указывает на то, что не был выбран надлежащий уровень абстракции. Вместо того чтобы объявлять метод, генерирующий IOException, IOException следует преобразовать в исключение, которое больше подходит для происходящего.

У меня нет проблем с переносом Main с catch (Exception) (или, в некоторых случаях, catch (Throwable), чтобы программа могла корректно завершиться - но я всегда ловлю конкретные исключения, которые мне нужны. Это позволяет мне, по крайней мере, отобразить соответствующее сообщение об ошибке.

Вопрос, на который люди никогда не отвечают, таков:

Если вы выбросите RuntimeException подклассы вместо исключения подклассы, то как вы знаете, что ты должен ловить?

Если ответом является catch Exception, то вы также имеете дело с ошибками программиста так же, как системные исключения. Это кажется мне неправильным.

Если вы перехватываете Throwable, то вы обрабатываете системные исключения и ошибки ВМ (и тому подобное) одинаково. Это кажется мне неправильным.

Если ответ таков, что вы ловите только те исключения, которые, как вы знаете, выбрасываются, то как вы узнаете, какие из них выбрасываются? Что происходит, когда программист X выдает новое исключение и забывает его поймать? Это кажется мне очень опасным.

Я бы сказал, что программа, отображающая трассировку стека, неверна. Неужели люди, которым не нравятся проверенные исключения, так не чувствуют?

Итак, если вам не нравятся отмеченные исключения, можете ли вы объяснить, почему нет, И, пожалуйста, ответьте на вопрос, на который нет ответа?

Редактировать: я не ищу совета о том, когда использовать какую-либо модель, я ищу , почему люди выходят из RuntimeException, потому что им не нравится выходить из Exception и / или почему они ловят исключение, а затем перебрасывать RuntimeException вместо добавления бросков к их методу. Я хочу понять мотивацию неприязни к проверенным исключениям.

Ответы [ 32 ]

0 голосов
/ 23 августа 2011

Несмотря на то, что я прочитал всю страницу, я все еще не могу найти ни одного разумного аргумента против проверенных исключений. Вместо этого большинство людей говорят о плохом дизайне API, либо в некоторых классах Java, либо в своих собственных классах.

Единственный сценарий, в котором эта функция может раздражать, - создание прототипов. Эту проблему можно решить, добавив некоторый механизм в язык (например, некоторую аннотацию @supresscheckedexceptions). Но для обычного программирования я думаю, что проверенные исключения - это хорошая вещь.

0 голосов
/ 23 августа 2013

На мой взгляд, проверенные исключения - очень хорошая концепция. К сожалению, у большинства программистов, которые работали вместе, у меня есть другое мнение, так что в проектах часто используется неправильная обработка исключений. Я видел, что большинство программистов создают один (только один) класс исключений, подкласс RuntimeException. Это содержит сообщение, иногда многоязычный ключ. У меня нет шансов спорить против этого. У меня сложилось впечатление, что я разговариваю со стеной, когда объясняю им, что такое анти-паттерны, что такое контракты методов ... Я немного разочарован.

Но сегодня стало очевидным, что концепция исключения из среды выполнения для всего является антишаблоном. Они использовали его для проверки ввода пользователя. Выдается исключение, чтобы пользовательский диалог мог сделать из него сообщение об ошибке. Но не каждый участник этого метода - это диалог! При создании исключения во время выполнения контракт метода был изменен, но не объявлен, поскольку он не был проверенным исключением.

Надеюсь, они сегодня кое-что узнали и проведут свои проверки (которые полезны и необходимы) в другом месте. Использование только проверенного исключения не может решить проблему, но проверенное исключение будет сигнализировать программисту, что он реализует что-то не так.

...