По ловле Throwableэто включает в себя вещи, которые подкласс Error. Как правило, вы не должны этого делать, за исключением, возможно, самого высокого уровня «catch all» потока, где вы хотите регистрировать или иным образом обрабатывать абсолютно все, что может пойти не так. Это было бы более типичным в приложении типа платформы (например, на сервере приложений или в среде тестирования), где оно может запускать неизвестный код, и на него не должно воздействовать , насколько это возможно, что- то не так с этим кодом.
Вероятно, было бы лучше объяснить немного иерархии здесь.
Xonatron
11
Контекст для этого ответа: Throwable включает как Error, так и Exception в качестве подклассов, поэтому первый try / catch включает в себя второй, но обычно слишком широкий.
Ноэль
2
Он также включает в себя определенные пользователем прямые подклассы Throwable и экземпляры самого Throwable. Ничто не мешает вам писать throw new Throwable();, так что это единственный способ по-настоящему поймать все.
Сурьма
3
Несмотря на то, что он принят, он не отвечает на вопрос, потому что большая часть ответа описывает лучшую практику для ловли как Exception, так и Throwable, и вопрос был о разнице (например, когда использовать, когда я действительно хочу либо). «Он включает в себя вещи, которые являются подклассом Error» - единственное указанное отличие, и это действительно исчерпывающий ответ: что такое Error? Почему важно, что оно включает это? Есть ли другие отличия или лучшие практики?
Нив
@OdedNiv "Что такое ошибка? Почему это так важно?" Вы можете задать их в другом вопросе.
Errorпрограммно не подлежит восстановлению каким-либо образом и обычно не может быть перехвачен, за исключением целей регистрации (которая пропускает его снова). Exceptionпрограммно восстанавливаемый. Его подкласс RuntimeExceptionуказывает на ошибку программирования и, как правило, также не обнаруживается.
Удивительно, но через 4 года после этого ответа большинство инструментов «анализа кода» по-прежнему будут сообщать о броске броска как о критической ошибке. Ведение журнала - очень веская причина для ловли Throwable. Годы разработки серверов говорят мне, что 1) ведение журнала будет происходить несмотря на получение Errorи 2) Если нет ведения журнала, вы можете никогда не получить уведомление о том, что произошло OOM, оставив вас удивленным, почему сервер начал вести себя «смешно»
Бруно Гридер,
4
Что programmatically unrecoverableименно означает? Это настолько серьезно, что мы больше не можем вызывать ЛЮБОЙ Java-метод после его перехвата (регистрации и т. Д.) Без возможности получить непредсказуемое поведение от JVM в результате?
Александр Абакумов
Its subclass RuntimeException indicates a programming errorНе уверен, что я согласен с этим утверждением. Если это правда, это означает, что все ожидаемые исключения должны быть проверены. Что если я ожидаю, что что-то может произойти сбой и не может быть восстановлено моим приложением, но я хочу, по крайней мере, выдать значимое исключение? Использование проверенного исключения в этом случае кажется бесполезным и создает стандартный код.
Nom1fan
22
Thowableдействительно перехватывает все, даже ThreadDeath, который по умолчанию генерируется, чтобы остановить поток из устаревшего Thread.stop()метода. Таким образом, поймав, Throwableвы можете быть уверены, что никогда не покинете блок try, по крайней мере, не пройдя блок catch, но вы также должны быть готовы обработать OutOfMemoryErrorи InternalErrorили StackOverflowError.
Catching Throwableнаиболее полезен для внешних серверных циклов, которые делегируют всевозможные запросы внешнему коду, но могут сами по себе никогда не завершаться, чтобы поддерживать работу службы.
Throwableэто супер класс, Exceptionа также Error. В обычных случаях мы всегда должны ловить подклассы Exception, чтобы основная причина не терялась.
Только особые случаи, когда вы видите вероятность того, что что-то пойдет не так, что не контролирует ваш Java-код, вы должны ловить Errorили Throwable.
Я помню, как ловил Throwable, чтобы указать, что нативная библиотека не загружена.
Ответы:
По ловле
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, чтобы поймать некоторые ошибки, которые могут произойти из-за сбоя / отсутствия инфраструктуры.
источник