Все зависит немного от того, что вы собираетесь делать с ошибкой, как только вы ее поймали. В общем, перехват ошибок, вероятно, не следует рассматривать как часть вашего «нормального» потока исключений. Если вы поймаете его, вам не следует думать о том, чтобы «продолжать, как будто ничего не произошло», потому что JVM (и различные библиотеки) будут использовать ошибки как способ сообщить о том, что «что-то действительно серьезное произошло, и нам нужно закрыть как можно скорее ". В общем, лучше слушать их, когда они говорят, что конец близок.
Другая проблема заключается в том, что возможность восстановления или нет из-за ошибки может зависеть от конкретной виртуальной машины, над которой вы можете или не можете контролировать.
Тем не менее, есть несколько угловых случаев, когда безопасно и / или желательно отлавливать ошибки или, по крайней мере, некоторые подклассы:
- Существуют случаи, когда вы действительно хотите остановить нормальное течение: например, если вы работаете с сервлетом, вы, возможно, не захотите, чтобы обработчик исключений по умолчанию, выполняемый сервлетом, сообщал миру о том, что у вас есть ошибка OutOfMemoryError, независимо от того, можете ли вы восстановить ее.
- Иногда возникает ошибка в случаях, когда JVM может корректно восстановиться после причины ошибки. Например, если OutOfMemoryError возникает при попытке выделить массив, по крайней мере, в Hotspot, кажется, вы можете безопасно восстановиться после этого. (Конечно, есть и другие случаи, когда OutOfMemoryError может быть сгенерирован, когда небезопасно пытаться пахать.)
Итак, суть в следующем: если вы ловите Throwable / Error вместо Exception, это должен быть четко определенный случай, когда вы знаете, что «делаете что-то особенное» .
Редактировать: Возможно, это очевидно, но я забыл сказать, что на практике JVM может фактически не вызывать ваше предложение catch при ошибке. Я определенно видел, как Hotspot бросает тень на попытки поймать определенные ошибки OutOfMemoryError и NoClassDefFoundError.