Exception

2013. 8. 4. 16:09Java

 

 

 

프로그램 개발시 발생하는 예측 유무를 따라 예외상황이 발생한다.
이런 부분에 대해서는 java.lang.Throwable 클래스를 통해 처리하게 되어 있다
.
예외는 3가지 종류가 있다.

 

1.    Checked exception
컴파일 단계에서 확인 가능한 예외

 

2.    Runtime exception (unchecked exception)
컴파일시 모르다가, 실행시 발생 가능한 예외

 

3.    Error
정의된 exception 클래스를 제외한 모든 예외상황에 해당.

 

 

* 예외를 처리하는 방법은 2가지

 

A.    Try~catch~finally
method a() {
  try {
    //
실행시간에 예외가 발생할 수 있는 코드들..
  } catch (Exception e) {
    //
예외발생시에 처리할 코드들..
  }
}

위와 같이 try - catch 블록을 써서 예외를 직접 받아서(catch) 처리할 경우는
try
블록 내에서 예외가 발생했을 때, 예외가 던져지고(throw), 이 던져진 예
외는 catch 블록에 의해서 받아져서 결국, catch 블록내의 코드들이 실행됩니다.
이 경우에는 예외가 발생하더라도 catch 블록에 의해 처리되고 난 후, catch
블록 이 후의 코드들이 계속해서 실행 될 수 있습니다.

* try - catch 사용시 주의사항:

1. 반드시 들어가야 되는 내용은 try - catch 문에 넣지 않도록 한다. 예외가 발생하면 자동으로 뛰어넘을 수 있다.

2. catch(Exception e)를 사용하면 모든 요류를 다 잡는다. 하지만, catch 블럭을 다중으로 쓸 때 가장 강력한 catch(Exception e) 는 가장 마지막에 놓도록 한다.

 

B.   Throw 구문을 통한 처리

- throws IOException

구문 그대로 해석을 해 보면, [입출력 예외를 던진다] 입니다.

자바에서는 런타임시에 발생할 수 있는 여러가지 예외들을 처리하는
별도의 메카니즘을 가지고 있습니다. throws 키워드는 실행시간에 예외가 발생했을 경우 해당 예외를 직접처리하지 않고 다른 곳에서 처리하도록 예외를 던지겠다 라는 의미입니다.

method a() throws Exception {
  
//
실행시간에 예외가 발생할 수 있는 코드들..
}


이 처럼 예외를 직접처리하지 않고 던지는 경우에는, 예외가 발생하면 a() 소드의 예외발생 지점부터 그 후의 코드들은 실행이 중단되며, a() 메소드를 호출한 다른 메소드에게 예외가 던져집니다(throw). 만약 main() 메소드에서 a() 메소드를 호출했다면, 해당 예외는 main() 메소드에게로 전달되고, main() 메소드에서도 직접 처리하지 않고 예외를 던질경우 자바가상머신(JVM)이 해당 예외를 받아서 처리하게 됩니다. , 이렇게 예외를 던질경우는 예외발생 즉시 코드의 실행은 중단되며, 결국 JVM에 의해 예외에 대한 레포트가 화면에 출력 되고 프로그램이 종료됩니다.

* throws 
exception를 처라하기 보다는 발생한 exception Object를 양도하는 것이다. 즉 현재 method에서 exception처리를 하기가 조금 어려운 상태일 때 현재 영역을 호출해 준 곳으로 발생한 exception Object를 대신 처리해 다라면 양도하는 것이다.

3. 또한 다음과 같이 의도적으로 예외를 발생

method a() throws MyException {
  if (
//
예외발생 조건이 만족되면..) {
    throw new MyException();
  }
}

위와 같이 의도적으로 예외를 발생시켜서 이를 try - catch 블록으로 처리 하던지
아니면 a() 메소드를 호출한 메소드로 던지던지 할 수 있습니다. 이 예제의 경우 위와 같이 하기 위해서는 다음과 같은 형태의 MyException 클래스가 정의되어 있
어야 합니다.

class MyException extends Exception {
  
// MyException
클래스 정의 코드들..
}

위와 같이 예외를 던지기 위한 클래스 정의의 경우는 일반적으로 Exception 클래스를 상속받아서 작성하며, 이는 예외를 던지는 메카니즘을 구현하기 위한 방법입니다. 참고로 Exception 클래스는 Throwble 클래스의 하위 클래스이며 Throwble 클래스가 모든 예외나 에러 클래스들의 슈퍼클래스 이며, throws 메카 니즘의 출발점이 됩니다.

 

** Throws Throwable & throws Exceptions 의 차이점

Throwable
은 최상위 클래스다 즉 Exception을 포함하는데, Error 클래스도 Throwable의 하위 클래스 이다.
public void test() throws Exception{ 
위와 같이 선언된 메서드를 호출한다면 꼭 try catch 문으로 감싸줘야 한단다
.

try{
             A.test();
}catch(Exception e){
       //
에러 처리 코드

       throw e;
}

test
메소드에서 java.lang.Error 혹은 그 하위 클래스의 Throwable throw 하는 경우가 발생한다면 위의 코드는 오류를 보이지 않습니다.

그러나, catch 에서 Throwable 을 잡지 않았기 때문에 상위 호출 스택으로 보내지게 된다. , 위의 catch 구문에서 에러처리를 했다고 프로그래머는 생각하지만 실제로는 에러처리 로직을 수행하지 않고 상위 스택으로 흐름이 넘어가게 된다
.

물론 상위 스텍(호출부분)에서 Throwable을 처리하면 상관없지만, 그렇지 않으면 최악의 경우 (Thread pool 등에서) 작업 Thread 가 관리 루틴 밖으로 나가면서 심각한 오류를 범하게 된다
.

Exception
Throwable로 하게 된다면 흔히 발생하지는 않지만 개발시 놓치기 쉬운 부분에 대한 조치도 가능하다.