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