Иногда я вижу
try {
} catch(Throwable e) {
}
И иногда
try {
} catch(Exception e) {
}
В чем разница?
Иногда я вижу
try {
} catch(Throwable e) {
}
И иногда
try {
} catch(Exception e) {
}
В чем разница?
Ответы:
По ловле Throwable
это включает в себя вещи, которые подкласс Error
. Как правило, вы не должны этого делать, за исключением, возможно, самого высокого уровня «catch all» потока, где вы хотите регистрировать или иным образом обрабатывать абсолютно все, что может пойти не так. Это было бы более типичным в приложении типа платформы (например, на сервере приложений или в среде тестирования), где оно может запускать неизвестный код, и на него не должно воздействовать , насколько это возможно, что- то не так с этим кодом.
throw new Throwable();
, так что это единственный способ по-настоящему поймать все.
Первый перехватывает все подклассы Throwable
(включая Exception
и Error
), второй перехватывает все подклассы Exception
.
Error
программно не подлежит восстановлению каким-либо образом и обычно не может быть перехвачен, за исключением целей регистрации (которая пропускает его снова). Exception
программно восстанавливаемый. Его подкласс RuntimeException
указывает на ошибку программирования и, как правило, также не обнаруживается.
Error
и 2) Если нет ведения журнала, вы можете никогда не получить уведомление о том, что произошло OOM, оставив вас удивленным, почему сервер начал вести себя «смешно»
programmatically unrecoverable
именно означает? Это настолько серьезно, что мы больше не можем вызывать ЛЮБОЙ Java-метод после его перехвата (регистрации и т. Д.) Без возможности получить непредсказуемое поведение от JVM в результате?
Its subclass RuntimeException indicates a programming error
Не уверен, что я согласен с этим утверждением. Если это правда, это означает, что все ожидаемые исключения должны быть проверены. Что если я ожидаю, что что-то может произойти сбой и не может быть восстановлено моим приложением, но я хочу, по крайней мере, выдать значимое исключение? Использование проверенного исключения в этом случае кажется бесполезным и создает стандартный код.
Thowable
действительно перехватывает все, даже ThreadDeath, который по умолчанию генерируется, чтобы остановить поток из устаревшего Thread.stop()
метода. Таким образом, поймав, Throwable
вы можете быть уверены, что никогда не покинете блок try, по крайней мере, не пройдя блок catch, но вы также должны быть готовы обработать OutOfMemoryError
и InternalError
или StackOverflowError
.
Catching Throwable
наиболее полезен для внешних серверных циклов, которые делегируют всевозможные запросы внешнему коду, но могут сами по себе никогда не завершаться, чтобы поддерживать работу службы.
Throwable
это супер класс, Exception
а также Error
. В обычных случаях мы всегда должны ловить подклассы Exception
, чтобы основная причина не терялась.
Только особые случаи, когда вы видите вероятность того, что что-то пойдет не так, что не контролирует ваш Java-код, вы должны ловить Error
или Throwable
.
Я помню, как ловил Throwable, чтобы указать, что нативная библиотека не загружена.