В общем, Error
- это что-то серьезно неправильное (часто в самой платформе ), которое вы не могли бы себе представить. Единственный раз, когда я заботился о том, чтобы поймать Error
, это чтобы записал его , после чего я затем перебросил.
Это жизненно важно, поскольку легко допустить, чтобы ошибки (и исключения времени выполнения) распространялись вверх по стеку вызовов таким образом, чтобы они никогда не регистрировались (например, используя executorService.submit(Runnable)
без прослушивания возвращенного Future
)
Error
обычно это такие вещи:
- недостаточно памяти
- ошибка абстрактного метода (например, при работе с библиотеками разных версий, отличными от тех, которые созданы)
- Утверждения (то есть определяемые программистом инварианты , или вещи, которые никогда не должны происходить - лол!)
Я бы тогда сказал, что RuntimeException
s обычно (хотя и не всегда) указывают на программирование ошибок:
- не проверяет наличие нуля или не передает нулевое значение
- передача недопустимых аргументов или разрешение недопустимого состояния
- изменение коллекции во время итерации по ней
Я бы тоже порекомендовал быструю неудачу на них, но это серая область; возможно, вы не проверяете пользовательский ввод перед передачей его на сервер - вряд ли стоит разбить ваше приложение!
Проверено Exception
s (т. Е. Не время выполнения) следует использовать для вещей, которые вы могли бы разумно ожидать и разумно (или предположительно) обрабатывать в своем коде. Лично мне нравятся проверенные исключения, но они становятся громоздкими из-за многословия / повторения, связанных с одинаковой обработкой различных типов исключений (то есть в нескольких идентичных блоках перехвата). Такие языки, как Scala, имеют гораздо лучший синтаксис перехвата, но затем они убрали концепцию проверенных исключений!