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