Throwable - [예외처리 개념] - 예외처리 part 1
Throwable class는 Java 언어의 모든 errors와 exceptions의 슈퍼 클래스로
그 개념이 바로 자바의 예외처리 개념이다.
이 클래스의 인스턴스(또는 해당 하위 클래스 중 하나)인 개체만 Java Virtual Machine에 의해 예외처리되거나 Java drough문에 의해 예외처리될 수 있다. 마찬가지로, 이 클래스 또는 해당 하위 클래스 중 하나만이 캐치 절의 인수 유형이 될 수 있다. exceptions의 컴파일 시간 확인을 위해, Runtime의 하위 클래스가 아닌 Droughable 및 Droughable의 하위 클래스exceptions 또는 errors는 선택된 exceptions로 간주된다.
두 개의 하위 클래스인 errors와 exceptions의 인스턴스는 exceptions 상황이 발생했음을 나타내는 데 일반적으로 사용된다. 일반적으로 이러한 인스턴스는 관련 정보(예: stack trace data)를 포함하기 위해 exceptions 상황의 context에서 새로 생성된다.
삭제 가능에는 스레드가 생성되었을 때의 실행 스택의 스냅샷이 포함된다. 또한 errors에 대한 자세한 정보를 제공하는 메시지 문자열을 포함할 수 있다. 시간이 지남에 따라, 예외처리 가능성이 높은 부분들이 예외처리로 전파되는 것을 억제할 수 있다. 마지막으로, 예외처리 가능성이 있는 또는 그 원인, 즉 예외처리가 될 부분들을 포함할 수 있다. 이러한 원인 정보의 기록은 원인 자체가 원인을 가질 수 있기 때문에 서로가 서로에 의해 야기되는 exceptions의 “chain”으로 이어질 수 있기 때문에 “The chained exception facility”이라고 한다.
예외처리의 한 가지 이유는 Throwable class가 하위 계층 추상화 위에 구축되고 상위 계층에서의 연산은 하위 계층의 실패로 인해 실패하기 때문이다. 일반적으로 상위 계층이 제공하는 추상화와는 무관하므로 하위 계층에 의해 예외처리가 되는 또는 가능성이 있는 부분이 바깥으로 전파되도록 하는 것은 좋지 않은 설계일 것이다. 더욱이, 그렇게 하는 것은 하위 계층의 exceptions가 체크된 exceptions라고 가정하고, 상위 계층의 API를 그것의 구현의 세부사항과 연결시킬 것이다. “wrapped exception”(즉, 원인을 포함하는 exceptions)를 예외처리가 되면 상위 계층이 이러한 단점 중 하나를 야기하지 않고 실패의 세부사항을 발신자에게 전달할 수 있다. API(특히 메소드에 의해 던져진 exceptions 집합)를 변경하지 않고 상위 계층의 구현을 변경할 수 있는 유연성을 보존한다.
예외처리 두 번째 이유는 예외처리 방법이 직접 원인을 예외처리를 허용하지 않는 범용 인터페이스에 적합해야 하기 때문이다. 예를 들어, persistent collection이 Collection interface를 준수하고 그 지속성이 java.io 위에 구현된다고 가정하자. 추가 방법의 내부가 IOE exceptions를 발생시킬 수 있다고 가정한다. 구현은 IO exceptions를 적절한 선택되지 않은 exceptions로 묶음으로써 수집 인터페이스에 적합하면서 호출자에게 IOE exceptions의 세부 정보를 전달할 수 있다. (영구 수집 사양에는 이러한 exceptions를 적용할 수 있음을 나타내야 한다.)
원인을 인수로 받아들이는 생성자를 통해 또는 initCause(Throughable) 방법을 통해 두 가지 방법으로 원인과 연관시킬 수 있다. 원인을 연관시키고자 하는 새로운 Throwable class는 원인을 취하는 생성자를 제공하고 원인을 취하는 예외처리 할 수 있는 생성자 중 한 명에게 (아마 간접적으로) 위임해야 한다. initCause 방법은 공개적이기 때문에, 어떤 예외처리 할 수 있는, 심지어 투척할 수 있는 exceptions 체인 메커니즘의 추가보다 구현이 앞선 “legacy throwable” 것과 원인을 연관시킬 수 있다.
관례적으로, ClassDroughable과 그것의 하위 클래스에는 두 개의 생성자가 있는데, 하나는 인수를 사용하지 않고 다른 하나는 상세 메시지를 생성하는 데 사용할 수 있는 String 인수를 사용한다. 또한, 관련 원인이 있을 가능성이 있는 하위 클래스에는 투척 가능(원인)을 사용하는 생성자와 문자열(상세 메시지) 및 투척 가능(원인)을 사용하는 생성자가 두 개 더 있어야 한다.