Java Exception handling

자바는 try catch 구문을 사용하여 예외 처리(exception handling)을 하게 되어 있다. 예외가 발생할 수 있는곳에는 모두 예외처리를 하는 것이 좋긴하지만, 개발자들이 잘 알지 못하고 사용한다면 오히려 시스템 성능을 떨어뜨리는 독이 될 수도 있다.

예외처리를 하는데 있어서 몇가지 고려해야 할 점을 알아보자.

예외 처리(exception handling)시에 지켜주어야할 순서가 있고, 순서가 잘못되면 정확한 예외 메시지를 얻을 수 없게 되고, 또한 코드도 복잡해 진다.
일반적으로 예외를 처리에 있어 어떤 메소드를 호출하고 실행할 때, 그 메소드가 어떤 결과값을 반환하고, 어떠한 경우에 예외가 발생하는지를 정확히 알고 있어야 한다. 
즉, 어떤 위치에서 예외가 발생했는지를 정확하게 알 수 있어야 한다.
따라서 다중으로 예외를 선언한 경우에 주의가 필요하다. 만약 어떤 예외를 상속 받아서 새로운 Exception 들을 만들었다면, 상속 받았던 에외들을 먼저 선언해 주어야 한다. 그렇지 않다면, 원하지 안은 결과를 얻을 수도 있다.

아래와 같은 예외처리 코드가 있다고 하자.
JVM 에서는 첫번째 Catch블록에서 부터 호출된 예외를 처리한 Catch블럭을 찾아 내려온다. 만약 처리 가능한 예외 블록이 있다면, 비교를 멈추고 catch블록에 정의된 예외처리 코드들을 실행하게 된다.
따라서 만약에 첫번째 catch블록이 catch(Exception e)라고 정의되어 있다면, 컴파일러는 다른 catch블록이 전혀 필요 없다고 여기고 그 아래 ArrayIndexOutOfBoundsExceptionn e1을 처리하지 않을 것이다.

try {
      code...;
} catch (Exception e) {
     exception handling...;
} catch (ArrayIndexOutOfBoundsExceptionn e1) {
     exception handling...;
}

이런 순서를 모르고서 코드를 작성한다면 의미없는 코드가 되고 결국은 나중에 코드의 문제점을 찾는데 시간이 많이 소요된다.


자바를 개발시에 IDE툴을 많이 사용하게 된다. IDE툴에서는 자동으로 예외처리 코드를 생성해준다

java.io.File file = new java.io.File("c:\\file.txt");
try{
    file.getCanonicalFile();
catch (IOException e) {
    e.printStackTrace();
}

한가지 주위해야 하는 것은 위와 같이 "e.pringStackTrace()"를 툴에서 자동으로 생성해 주었다고, 예외 처리가 모두 끝나는 것이 아니다. 
처리해야할 예외에 대한 후 작업이 있다면 별도 코드를 작성해야 하며 예외를 Log에 남기는 부분도 필요하다. 
Logging또한 "e.printStackTrace()"등의 IDE에서 만들어주는 코드를 그대로 남기는데, 어떤 경우에 예외가 호출되었는지에 대한 정확한 정보를 남기기 위해서 개발자가 나중에 알수 있는 형태의 메시지 형태로 재정의 해서 남겨야 한다.

 예외가 발생했을 경우 가장 판단하기 어려운 때는 try-catch문을 잘못 중첩해서 사용하는 경우인데, 이 경우는 가독성도 떨어지지만, 예외 처리 코드를 분석하기 매우 어렵기 때무에 되도록이면 피하는 것이 좋다.




Posted by finewoo
,