Разница между использованием Throwable и Exception в пробном улове


Ответы:


247

По ловле Throwableэто включает в себя вещи, которые подкласс Error. Как правило, вы не должны этого делать, за исключением, возможно, самого высокого уровня «catch all» потока, где вы хотите регистрировать или иным образом обрабатывать абсолютно все, что может пойти не так. Это было бы более типичным в приложении типа платформы (например, на сервере приложений или в среде тестирования), где оно может запускать неизвестный код, и на него не должно воздействовать , насколько это возможно, что- то не так с этим кодом.


30
Вероятно, было бы лучше объяснить немного иерархии здесь.
Xonatron

11
Контекст для этого ответа: Throwable включает как Error, так и Exception в качестве подклассов, поэтому первый try / catch включает в себя второй, но обычно слишком широкий.
Ноэль

2
Он также включает в себя определенные пользователем прямые подклассы Throwable и экземпляры самого Throwable. Ничто не мешает вам писать throw new Throwable();, так что это единственный способ по-настоящему поймать все.
Сурьма

3
Несмотря на то, что он принят, он не отвечает на вопрос, потому что большая часть ответа описывает лучшую практику для ловли как Exception, так и Throwable, и вопрос был о разнице (например, когда использовать, когда я действительно хочу либо). «Он включает в себя вещи, которые являются подклассом Error» - единственное указанное отличие, и это действительно исчерпывающий ответ: что такое Error? Почему важно, что оно включает это? Есть ли другие отличия или лучшие практики?
Нив

@OdedNiv "Что такое ошибка? Почему это так важно?" Вы можете задать их в другом вопросе.
Kronen

182

Первый перехватывает все подклассы Throwable(включая Exceptionи Error), второй перехватывает все подклассы Exception.

Errorпрограммно не подлежит восстановлению каким-либо образом и обычно не может быть перехвачен, за исключением целей регистрации (которая пропускает его снова). Exceptionпрограммно восстанавливаемый. Его подкласс RuntimeExceptionуказывает на ошибку программирования и, как правило, также не обнаруживается.


37
Удивительно, но через 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наиболее полезен для внешних серверных циклов, которые делегируют всевозможные запросы внешнему коду, но могут сами по себе никогда не завершаться, чтобы поддерживать работу службы.


21

Throwableэто супер класс, Exceptionа также Error. В обычных случаях мы всегда должны ловить подклассы Exception, чтобы основная причина не терялась.

Только особые случаи, когда вы видите вероятность того, что что-то пойдет не так, что не контролирует ваш Java-код, вы должны ловить Errorили Throwable.

Я помню, как ловил Throwable, чтобы указать, что нативная библиотека не загружена.


0

Я видел, как люди используют Throwable, чтобы поймать некоторые ошибки, которые могут произойти из-за сбоя / отсутствия инфраструктуры.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.