Какой подкласс Throwable должен быть пойман, а какой нет? - PullRequest
4 голосов
/ 27 января 2010

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

Ответы [ 2 ]

6 голосов
/ 27 января 2010

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

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

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

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

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

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

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

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

4 голосов
/ 27 января 2010

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

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

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

...