때때로, 나는 본다
try {
} catch(Throwable e) {
}
그리고 때로는
try {
} catch(Exception e) {
}
차이점은 무엇입니까?
답변
잡으면 서 Throwable
서브 클래스를 포함합니다 Error
. 일반적으로 로그를 작성하거나 잘못 될 수있는 모든 것을 처리하려는 스레드의 최상위 “모두 잡기”수준을 제외하고는 그렇게하지 않아야합니다. 알 수없는 코드를 실행할 수 있으며 가능한 한 해당 코드에 문제가있는 것에 영향을받지 않아야하는 프레임 워크 유형 응용 프로그램 (예 : 응용 프로그램 서버 또는 테스트 프레임 워크)에서 더 일반적입니다 .
답변
첫 번째 것은의 모든 서브 클래스를 Throwable
포함 Exception
하고 (이 포함 하고 Error
) 두 번째 것은의 모든 서브 클래스를 포착합니다 Exception
.
Error
프로그래밍 방식으로 복구 할 수 없으며 로깅 목적 (다시 통과)을 제외하고는 일반적으로 포착되지 않습니다. Exception
프로그래밍 방식으로 복구 할 수 있습니다. 서브 클래스 RuntimeException
는 프로그래밍 오류를 나타내며 일반적으로 포착되지도 않습니다.
답변
Thowable
현재 사용되지 않는 Thread.stop()
메소드 에서 스레드를 중지하기 위해 기본적으로 throw되는 ThreadDeath조차도 실제로 잡습니다 . 그래서 잡기로 Throwable
당신은 당신이 적어도 당신의 catch 블록 거치지 않고 try 블록을 떠나지 않을 거라고 확신 할 수 있습니다,하지만 당신은 또한 준비를 처리해야 OutOfMemoryError
하고 InternalError
나 StackOverflowError
.
캐치 Throwable
는 모든 종류의 요청을 외부 코드에 위임하지만 서비스를 유지하기 위해 종료되지 않는 외부 서버 루프에 가장 유용합니다.
답변
Throwable
Exception
뿐만 아니라 슈퍼 클래스입니다 Error
. 정상적인 경우 Exception
근본 원인을 잃지 않도록 항상 하위 클래스를 잡아야 합니다.
당신이 당신의 자바 코드의 제어에없는 잘못을가는 것들의 가능성을 볼 만 특별한 경우, 당신은 캐치 할 필요 Error
나 Throwable
.
네이티브 라이브러리가로드되지 않았다는 것을 표시하기 위해 Throwable을 잡는 것을 기억합니다.
답변
사람들이 Throwable을 사용하여 인프라 장애 / 비 가용성으로 인해 발생할 수있는 일부 오류를 포착하는 것을 보았습니다.