'Exception'에 해당되는 글 2건

  1. 2010.01.11 [Java] 예외처리(Exception handling)
  2. 2009.12.23 [JAVA] Exception 예외 클래스의 계층구조

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
,

기존 프로그래밍 언어에서는 프로그램에서 에러가 발생하면 에러를 적절히 처리하기가 상당히 어려웠다.
이는 언어 차원에서 에러를 처리할 수 있는 방법을 제공하지 않았기 때문이다.

에러는 여러 종류로 나눌 수 있다. 






여기서 문법적인 에러는 컴파일시 대부분 수정이 가능하다. 실행에러는 컴파일은 수행되었으나 실행시에 문제가 되는 경우로
논리적인 에러, 시스템에러, 예외 사항의 발생이다.
이중 논리적인 에러는 프로그래머가 코드를 잘못 작성해서 생기는 경우이며, 시스템적인 에러는 프로그래머의 의지와는
상관없이 발생하는 것이므로 프로그래머가 처리할 수 있는 방법은 없으며, 마지막으로 이제 다뤄볼 예외 사항이 발생하는 
경우이다.
예외사항은 정상적으로 프로그램이 동작중에 발생할 수 있는 여러가지 사항들이며 자바는 언어차원에서 이런 예외적인
사항의 처리를 지원하기 때문에 탄탄한 프로그램을 작성할 수 있다.


자바에서는 실행 시 발생할 수 있는 오류(Exception과 Error)를 클래스로 정의하였다. 
모든 클래스의 최상위 클래스는 Object클래스이므로 Exception과 Error클래스 역시 Object클래스의 하위클래스들이다. 

모든 예외의 최상위클래스는 Exception클래스이며, 상속계층도를 Exception클래스부터 도식화하면 다음과 같다. 





RuntimeException클래스들은 주로 프로그래머의 실수에 의해서 발생될 수 있는 예외들로서 자바의 프로그래밍 요소들과 관계가 깊다. 예를 들면, 배열의 범위를 벗어난다던가(IndexOutOfBoundsException), 값이 null인 참조변수의 멤버를 호출하려 했다던가(NullPointerException), 클래스간의 형변환을 잘못했다던가(ClassCastException), 정수를 0으로 나누려 했다던가(Arithmetic- Exception)하는 경우에 발생하는 예외들이다. 

RuntimeException클래스들 중의 하나인 ArithmeticException을 try-catch문으로 처리하는 경우도 있지만, 사실 try-catch문을 사용하기보다는 0으로 나누지 않도록 프로그램을 변경하는 것이 올바른 처리방법이다. 
이처럼 RuntimeException예외들이 발생할 가능성이 있는 코드들은 try-catch문을 사용하기 보다는 프로그래머들이 보다 주의 깊게 작성하여 예외가 발생하지 않도록 해야 할 것이다. 

그 외의 Exception클래스들은 주로 외부의 영향으로 발생할 수 있는 것들로서, 프로그램의 사용자들의 동작에 의해서 발생하는 경우가 많다. 예를 들면, 존재하지 않는 파일을 처리하려한다던지(FileNotFoundException), 실수로 클래스의 이름을 잘못 적었다던가(ClassNotFoundException), 입력한 데이터의 형식이 잘못되었다던가(DataFormatException) 하는 경우에 발생하는 예외들이다. 
이런 종류의 예외들은 반드시 처리를 해주어야 한다. 


RuntimeException클래스들 - 프로그래머의 실수로 발생하는 예외 
그 외의 클래스들 - 사용자의 실수와 같은 외적인 요인에 의해 발생하는 예외 

RuntimeException클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 코드에는 예외처리를 해주지 않아도 컴파일 시에 문제가 되지 않지만, 그 외의 Exception클래스들 그룹에 속하는 예외가 발생할 가능성이 있는 예외는 반드시 처리를 해주어야 하며, 그렇지 않으면 컴파일시에 에러가 발생한다. 


 
Posted by finewoo
,