Иногда я вижу
try {
} catch(Throwable e) {
}
И иногда
try {
} catch(Exception e) {
}
В чем разница
Иногда я вижу
try {
} catch(Throwable e) {
}
И иногда
try {
} catch(Exception e) {
}
В чем разница
Улавливая Throwable, он включает в себя вещи, которые относятся к подклассу Error. Вы, как правило, этого не делаете, за исключением, возможно, самого высокого уровня "поймать всех" нити, где вы хотите регистрировать или иным образом обрабатывать абсолютно все, что может пойти не так. Это было бы более типично в приложении типа структуры (например, сервер приложений или инфраструктура тестирования), где он может запускать неизвестный код и не должен влиять на что-либо, что пойдет не так с этим кодом, насколько это возможно.
Первый из них ловит все подклассы Throwable
(сюда входят Exception
и Error
), второй - всех подклассов Exception
.
Error
программно невосстанавливается каким-либо образом и, как правило, не может быть пойман, за исключением целей ведения журнала (который проходит его снова). Exception
программно восстанавливается. Его подкласс RuntimeException
указывает на ошибку программирования и обычно не может быть пойман.
Thowable
захватывает действительно все, даже ThreadDeath, который по умолчанию бросается, чтобы остановить поток из теперь устаревшего метода Thread.stop()
. Поэтому, поймав Throwable
, вы можете быть уверены, что никогда не оставите блок try, по крайней мере, не пройдя свой блок catch, но вы также должны быть готовы к обработке OutOfMemoryError
и InternalError
или StackOverflowError
.
Ловушка Throwable
наиболее полезна для внешних циклов сервера, которые делегируют все виды запросов внешнему коду, но сами не могут прекратить работу службы.
Throwable - это суперкласс Exception, а также Error. В обычных случаях мы всегда должны улавливать подклассы Exception, так что основная причина не теряется.
Только в особых случаях, когда вы видите вероятность того, что что-то пойдет не так, что не контролирует ваш Java-код, вы должны поймать Error или Throwable.
Я помню, как ловить Throwable, чтобы указать, что родная библиотека не загружена.