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

иногда я вижу

try {

} catch(Throwable e) {

}

и иногда

try {

} catch(Exception e) {

}

в чем разница

4 ответов


, ловя Throwable Он включает в себя вещи, которые подкласс Error. Вы вообще не должны этого делать, за исключением, возможно, самого высокого уровня "поймать все" потока, где вы хотите войти в систему или иначе обработать абсолютно все, что может пойти не так. Это было бы более типично для приложения типа framework (например, сервера приложений или платформы тестирования), где он может работать с неизвестным кодом и не должен зависеть от что-нибудь что не так с этим кодом, как насколько это возможно.


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

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


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

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

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


Thowable ловит действительно все, даже ThreadDeath, который бросается по умолчанию, чтобы остановить поток из теперь устаревшего Thread.stop() метод. Так ловить Throwable вы можете быть уверены, что никогда не покинете блок try, по крайней мере, не пройдя через блок catch, но вы должны быть готовы также обрабатывать OutOfMemoryError и InternalError или StackOverflowError.

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