자바 예외처리

출처 : http://hiddenviewer.tistory.com/103

예외처리는 객체지향 프로그래밍을 지원하는 언어에서 에러를 처리하기 위한 메커니즘이다. 전통적인 절차지향
언어에서는 함수의 반환값을 통해 에러 유무를 판단하였다. 매번 반환값을 검사하는 작업은 상당히 번거롭고,
그 반환값의 의미 또한 프로그래머가 인지하기 어려운 형태여서 에러처리가 불편하였다. 반면 예외처리 방식은
예외가 발생하면 그에 대한 정보를  얻을 수 있고, 제어 흐름 또한 쉽게 이동시킬 수 있는 방식이다.  
하지만 아무리 언어차원에서 좋은 메커니즘을 제공하더라도 언제, 어떻게 사용해야하는지 모른다면 무용지물이다.
C++와 Java 언어를 처음 접했을 때에도 언제, 어디서 예외를 던지고 잡아야 하는지가 난제였다.  예외처리에 대해서
좀더 자세히 알아보자.
자바의 철학은 “잘못 만든 코드는 실행되지 않아야 한다” 는 것이다. 그래서 에러를 잡는 가장 이상적인 시기는 컴파일
시기이다. 하지만 모든 에러를 컴파일 시에 검출할 수 는 없으며,  실제론 실행시점에 어떠한 절차를 거치면서 심각한 문제들이
더 발생하게 된다.  발생한 에러는,  프로그램이 수행하는 절차와 연관되어 그 에러를 올바르게 처리하는 방법을 아는 수신자가
처리해야한다.  그렇다. 처리하는 방법을 아는 수신자가 처리하게 해야하는 것이 정답이다. 이 개념을 설명하기에 앞서

자바에서 지원하는 예외(Exception) 클래스에 대해서 알아보자.

1. 예외란 무엇인가?
예외란 프로그램 절차상에서 정상 흐름을 벗어난 이벤트이다.

2.  자바의 예외처리 장점

비지니스 로직과 예외처리 코드를 분리해주는 장점이 있다.  try {} 블럭 안에서 비지니스 로직을 처리하며,
그에 대한 예외처리는 catch {} 라는  별도의 블럭에서 수행도히기 때문에 로직과 예외처리 영역이 명확히
분리가 된다.  또한 예외처리 영역에서는 예외클래스의 이름을 바탕으로 예외의 종류, 발생위치와 관련된 정보를
확인할 수 있다.  (예외이름이 발생한 문제를 나타내도록 알아보기 쉽게 지어야 하는 이유이다.)                                    

3. 예외관련 클래스 상속도
다음은 예외 관련 클래스 상속도이다.  모든 예외클랫들은 Throwable 인터페이스를 구현한다.  발생시 로직에 따라 적절히
처리 될 수 있는 문제들을 Exception 이라 하며,  심각한 문제들로 시스템을 중단해야할 문제들을 Error 라고 한다.
일반적으로 Checked  Exception을 상속하는 커스텀 예외 클래스를 생성하여 사용한다.

4. 예외처리를 위한 전략
발생한 예외는 상위계층으로 throw 하거나 또는  try~catch 구문을 사용하여 직접 처리할 수 있다.  throw 할지, 직접처리 할지에
대한 결정은 처리 절차에 의존한다.  

throw 할 예외와 직접 try~catch 여부를 어떻게 결정할 것인가?

  – 예외로 무엇을 할지 알 때까지는 그것을 catch 하지 말아라
  – 예외 발생시 어떻게 해야하는지 알고있는 절차를 다루는 클래스에게 까지 예외를 throw 하자.

다음 일반적인 프로그래밍 패턴 중에 언제  throw 와 try~catch 할지에 대한 사항이다.

데이터 추출     –  throw 한다.
유효성 검사     –  throw 한다.
처 리                 –  try ~ catch
결과출력         –  try ~ catch
1, 2 번 같은 경우 데이터를 제공하는 곳에서 예외를 처리 할 책임이 있다. 상위로 예외를 던진다(throw)
3. 4  번의 경우, 상위에서 제공하는 데이터에서 이상이 없고, 내가 처리하는 동안 발생한 예외므로 내가 처리할 책임이 있다. 예외를 try ~ catch 한다

예외를 위한 계획적인 전략 사용하기!

코딩하다 즉흥적으로 삽인하는 예외처리 코드가 아닌,  처음 절차에서부터 계획된 예외처리 전략을 사용해야 한다
예외처리 전략을 위한 과정은 다음과 같다
예외클래스를 정의하고,  언제, 어디서  throw 되고, try~catch 되야하는지 결정한다
비지니스 로직에 전념하고, 예외처리가 필요한 곳에는 주석으로 예외처리 표시를 한다.
예외처리가 필요한(주석을 단 부분)에 실제 처리코드를 삽입한다.
     
5. checked Exception 과 unchecked Exception

5.1 checked Exception 
컴파일 타임 예외로, 비지니스 데이터에 위해한 예외로 시스템 서비스에 부자연스러움을 가져오는 예외이다.
소스에 예외처리를 하지  않으면, 컴파일러 에러가 발생한다.
ex) IOException,  NumberFormatException
5.2 unchecked Exception
런타임 예외로, 비지니스 데이터에 위해하지 않지만, 시스템에 영향을 미칠 수 있는 예외이다.
unchecked Exception 은 try ~ catch 블럭이 없어도, 컴파일 에러가 발생하지 않는다.  주로  비지니스 로직상이 아닌
프로로램 자체상의 에러로,  프로그램 작성을 잘 못했을 때 발생한다.
ex) ClassCastException, IndexOutOfBoundsException, IllegalStateException

다음은  checked 예외인 Exception 을 상속하여, 다양한 생성자를 갖도록 오버로딩하여 사용하는 예이다.
 다음은 unchecked 예외인 RuntimeExcepting 을 상속하여,  다양한 생성자 오버로딩를 하여 사용하는 예이다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.