try catch에서 Throwable과 Exception 사용의 차이점


답변:


247

잡으면 서 Throwable서브 클래스를 포함합니다 Error. 일반적으로 로그를 작성하거나 잘못 될 수있는 모든 것을 처리하려는 스레드의 최상위 "모두 잡기"수준을 제외하고는 그렇게하지 않아야합니다. 알 수없는 코드를 실행할 수 있으며 가능한 한 해당 코드에 문제가있는 것에 영향을받지 않아야하는 프레임 워크 유형 응용 프로그램 (예 : 응용 프로그램 서버 또는 테스트 프레임 워크)에서 더 일반적입니다 .


30
아마도 여기에 약간의 계층 구조를 설명하는 것이 가장 좋습니다.
Xonatron

11
이 답변의 컨텍스트 : Throwable에는 오류와 예외가 하위 클래스로 포함되므로 첫 번째 시도 / catch에는 두 번째가 포함되지만 일반적으로 광범위합니다.
Noel

2
또한 Throwable의 사용자 정의 직접 서브 클래스와 Throwable 자체의 인스턴스도 포함합니다. 글쓰기를 막을 수있는 것은 throw new Throwable();없으므로 모든 것을 진정으로 잡을 수있는 유일한 방법입니다.
안티몬

3
수락되었지만, 대부분의 답변은 예외와 Throwable을 모두 잡는 가장 좋은 방법을 설명하기 때문에 질문에 대답하지 못합니다. "서브 클래스 오류가있는 것을 포함합니다"는 지정된 유일한 차이점이며 실제로 포괄적 인 답변입니다 : 오류 란 무엇입니까? 왜 포함되어 있는가? 다른 차이점이나 모범 사례가 있습니까?
Oded Niv

@OdedNiv "오류가 무엇인가요? 왜 오류가 포함됩니까?" 다른 질문을 할 수 있습니다.
Kronen

182

첫 번째 것은의 모든 서브 클래스를 Throwable포함 Exception하고 (이 포함 하고 Error) 두 번째 것은의 모든 서브 클래스를 포착합니다 Exception.

Error프로그래밍 방식으로 복구 할 수 없으며 로깅 목적 (다시 통과)을 제외하고는 일반적으로 포착되지 않습니다. Exception프로그래밍 방식으로 복구 할 수 있습니다. 서브 클래스 RuntimeException는 프로그래밍 오류를 나타내며 일반적으로 포착되지도 않습니다.


37
놀랍게도이 답변 후 4 년이 지난 지금도 대부분의 "코드 분석"도구는 여전히 중대한 오류 로 인해 잡을 수있는 것으로보고합니다 . 로깅은 Throwable을 잡는 매우 유효한 이유입니다. 서버를 개발 년은 1) 로깅이 점점에도 불구하고 일어날 것이라고 말해 Error서버가 "재미"행동을 시작 이유를 궁금해 떠나, OOM 일이 있고 2) 기록이 없다면, 당신은 통지를 만나지 월
브루노 Grieder

4
programmatically unrecoverable정확히 무엇을 의미합니까? JVM에서 예기치 않은 동작을 얻을 수있는 기회가 없으면 더 이상 Java 메소드를 더 이상 포착 (로깅 등) 한 후에 호출 할 수 없을 정도로 심각합니까?
Alexander Abakumov

Its subclass RuntimeException indicates a programming error:이 진술에 동의하는지 확실하지 않습니다. 이것이 사실이면 모든 예상 예외를 점검해야한다는 의미입니다. 응용 프로그램에서 문제가 발생하여 복구 할 수 없을 것으로 예상되지만 적어도 의미있는 예외를 throw하려면 어떻게해야합니까? 이 경우 확인 된 예외를 사용하면 쓸모가 없으며 상용구 코드가 생성됩니다.
Nom1fan

22

Thowable현재 사용되지 않는 Thread.stop()메소드 에서 스레드를 중지하기 위해 기본적으로 throw되는 ThreadDeath조차도 실제로 잡습니다 . 그래서 잡기로 Throwable당신은 당신이 적어도 당신의 catch 블록 거치지 않고 try 블록을 떠나지 않을 거라고 확신 할 수 있습니다,하지만 당신은 또한 준비를 처리해야 OutOfMemoryError하고 InternalErrorStackOverflowError.

캐치 Throwable는 모든 종류의 요청을 외부 코드에 위임하지만 서비스를 유지하기 위해 종료되지 않는 외부 서버 루프에 가장 유용합니다.


21

ThrowableException뿐만 아니라 슈퍼 클래스입니다 Error. 정상적인 경우 Exception근본 원인을 잃지 않도록 항상 하위 클래스를 잡아야 합니다.

당신이 당신의 자바 코드의 제어에없는 잘못을가는 것들의 가능성을 볼 만 특별한 경우, 당신은 캐치 할 필요 ErrorThrowable.

네이티브 라이브러리가로드되지 않았다는 것을 표시하기 위해 Throwable을 잡는 것을 기억합니다.


0

사람들이 Throwable을 사용하여 인프라 장애 / 비 가용성으로 인해 발생할 수있는 일부 오류를 포착하는 것을 보았습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.