Made in 2PARK

[0.05] 기본적인 예외처리 본문

자바기본

[0.05] 기본적인 예외처리

2PARK 2013. 12. 1. 21:09

1. try~ catch 구문

2. 예외처리 프로세스

3. e.getMassage

4. 예외처리 전반







1. try~catch 구문


프로그램을 구성할 때 굳이 try~catch문을 사용하지 않고 if문으로만 예외를 처리하는 방식도 있다. 간단한 경우에 해당하고 if문으로 예외처리를 반복하다보면 기본 프로그램의 흐름과 예외처리의 구분이 어려워 진다. (if가 예외처리로 쓰인건지 기본 프로그램 흐름인지)

따라서 적절하게 예외처리를 활용하여 프로그램 가독률도 높이고 예외처리 구문을 사용한 보다 체계적인 예외 관리가 필요하다.


 - try : 예외 발생 가능 지역을 감싸는 목적 (try부분은 그냥 프로그램의 정상적 흐름의 일부다. 독립된 별개의 것이 아님)

 - catch : try에서 발생한 예외를 받아서 처리 (catch부분은 명확히 예외를 처리하기 위한 것일 뿐 다른 목적은 없다.)


2. 예외처리 프로세스

 

 - 컴파일러는 예외 발생 시점을 언제로 보는가?

: 컴파일러는 불가능한 연산을 시도할 때 예외가 발생한 것으로 판단.

{

int num2=0; // 제수에 0이 들어가는 것 자체가 논리에 어긋나나, 프로그램에서 여기는 문제가 되지 않는다. 

나중에 num2로 나누기를 한다 하더라도 num2에 0이 들어가는 것 자체는 문제가 없단 이야기.

...

int num=num1/num2; // 여기서 예외가 발생한 것으로 판단.

}


 - 자바 JVM이 try 부분에서 예외를 감지 -> 이때 JVM은 예외상황에 따라 적절한 예외클래스를 선택 -> JVM이 예외클래스의 인스턴스를 생성 -> 이 인스턴스의 참조값을 catch로 전달 -> 참조값을 catch로 전달한 순간을 예외를 처리했다고 판단하게 된다. (따라서 우리는 catch부분에 예외를 적절히 처리할 코드를 집어넣어 주어야 한다. 왜냐하면 JVM은 catch에 뭐가 들었든 이미 예외를 처리했다고 판단하기 때문에.)


 - try와 catch는 메소드 내에 삽입된다.


 - 하나의 일의 단위로서 transaction(트랜잭션)

: try catch를 어떻게 구성해야 하는지 고민하기 위해선, 먼저 일의 단위를 구분해 주어야 한다. try는 예외가 발생하여 jvm이 감지를 하게 되면 예외가 발생한 지점부터 아래로 진행되지 않고 바로 catch로 건너가기에 try에 불필요한 문장 혹은 부족한 문장으로 구성되지 않게 신경써야 한다. 


 - catch는 연이어 올 수 있다.

: try

  catch(AgeInputException e) // JVM이 첫번째로 확인하는 catch영역

  catch(WrongNameException e) // JVM이 두번째로 확인하는 catch영역

  catech(Throwable e) // JVM이 마지막으로 확인하는 catch영역


  이 때에 throwable클래스는 모든 예외를 받을 수 있지 않겠는가? 따라서 throwable클래스 혹은 보다 상위 클래스가 첫번째 catch영역에 온다면 그 밑에 있는 catch는 의미가 없으므로, catch를 연이어 구성하고자 할 때에는 이러한 상속관계 혹은 포함관계를 잘 생각해야 한다.



3. e.getMassage


 - 모든 예외클래스는 Throwable 클래스를 상속하기에, Throwable 클래스에 정의된 e.getMassage메소드를 활용할 수 있다.





















Comments