Какой подкласс Throwable следует перехватывать, а какой нет?

StackOverflow https://stackoverflow.com/questions/2146108

  •  23-09-2019
  •  | 
  •  

Вопрос

Документ API говорит, что никогда не ловить Бросок подкласс Ошибка что означает ненормальное поведение.Означает ли это, что разделение между Error и Exception предназначено для того, чтобы сообщить программистам, какой подкласс следует перехватывать, а какой нет?Или это еще не все?

Это было полезно?

Решение

В общем, Error что-то серьезно не так (часто внутри самой платформы), с которым вы не могли справиться.Единственный раз, когда я заботился о том, чтобы поймать Error это для того, чтобы зарегистрируй это, после чего я повторно бросаю.

Это жизненно важно, поскольку легко позволить ошибкам (и исключениям времени выполнения) распространяться вверх по стеку вызовов таким образом, что они никогда не регистрируются (например,с использованием executorService.submit(Runnable) не слушая вернувшегося Future)

ErrorОбычно это такие вещи, как:

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

Я бы тогда сказал, что RuntimeExceptionобычно (хотя и не всегда) указывают на программирование ошибки:

  • не проверять значение null или не передавать значение null
  • передача недопустимых аргументов или разрешение недопустимого состояния
  • изменение коллекции при ее переборе

Обычно я бы рекомендовал и в этом отношении быстро работать, но это серая зона;возможно, вы не проверяете вводимые пользователем данные перед передачей их на сервер — вряд ли стоит ломать свое приложение!

Проверено Exceptionс (т.е.не-время выполнения) следует использовать для вещей, которые вы могли бы разумно ожидать и которые разумно (или предположительно) обработать в своем коде.Лично мне нравятся проверенные исключения, но они кажутся громоздкими из-за многословия/повторения, связанного с одинаковой обработкой различных типов исключений (т.е.в нескольких одинаковых блоках catch).Такие языки, как Scala, имеют гораздо лучший синтаксис, но затем они убрали концепцию проверено исключения тоже!

Другие советы

Да, я считаю, что здесь ваш анализ верен - вы не должны ловить Errors, потому что они представляют собой ошибки времени выполнения, которые невозможно исправить, например OutOfMemoryError.

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

Также было бы неплохо провести различие между Exception и RuntimeException.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top