Post

예외처리

프로그램 오류는 아래의 그림처럼 종류가 나뉜다.

Alt text

  1. 컴파일 에러
    컴파일할때 발생하는 에러로 프로그램이 시작되지 않는다.

  2. 런타임 에러
    프로그램이 실행 후 발생하는 에러로 프로그램이 비정상 종료된다.

  3. 논리적 에러
    프로그램을 구현한 의도와 달리 동작, 정상적으로 프로그램이 실행되고 종료된다.

  4. 에러(error)
    코드로 해결할 수 없는 심각한 프로그램 오류

  5. 예외(exception)
    코드로 수습할 수 있는 프로그램 오류이기 때문에 try-catch구문으로 처리해줘야한다

  6. Exception
    사용자의 실수로 인해 발생한 예외(IOException, ClassNotFoundException 등) + 프로그래머의 실수로 인해 발생한 예외(Runtime Exception)이지만 이 게시물에서는 설명 편의상 사용자의 실수로 인해 발생한 예외로 exception을 지칭하겠다. 예외처리를 반드시 해줘야한다.(checked)

  7. Runtime Exception
    프로그래머의 실수로 인해 발생한 예외, 예외처리을 선택적으로 해줘도 된다.(unchecked)


try-catch구문

예외를 처리하기 위해서 사용하는 구문이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
try {
    hasNoException();
    a();
    System.out.println("a 정상작동");
    b();
    System.out.println("end");

} catch (a메소드에서 발생할  있는 예외1) {
    System.out.println("a 에외처리");

} catch (b메소드에서 발생할  있는 예외2) {
    System.out.println("b 에외처리");
} ...

1. 메소드 a에서 예외가 발생하는 경우

  • hasNoException()
  • a(); 실행
  • a 예외처리 출력
  • try-catch구문 종료

2. 메소드 b에서 예외가 발생하는 경우

  • hasNoException()
  • a(); 실행
  • a 정상작동 출력
  • b(); 실행
  • b 예외처리 출력
  • try-catch구문 종료

3. 예외가 없는 경우

  • hasNoException()
  • a(); 실행
  • a 정상작동 출력
  • b(); 실행
  • b 정상작동 출력
  • end 출력
  • try-catch구문 종료

4. 메소드 hasNoException에서 예외가 발생하는 경우

  • hasNoException()
  • 예외 처리해줄 catch문이 없기 떄문에 프로그램 비정상 종료

finally블럭

try-catch-finally순으로 구성되며 예외 발생 유무나 return문 유무와 상관없이 finally블럭 안에 있는 코드는 반드시 실행된다.

예외 처리 방법

  • try-catch구문

  • 메소드에 예외 선언
    메소드 선언부에 throws 예외유형을 붙여 예외처리를 호출한 메소드에서 처리하도록 한다.

1
2
3
4
5
6
7
8
9
void A(){
    method1();
}
void method1() throws Exception{
    method2();
}
void method2() throws Exception{
    throw new Exception(); // 고의적으로 예외 발생
}

throw로 발생한 예외는 method2가 method1에게 thorws하고 method1은 throws해서 A에게 예외처리를 시킨다. 최종적으로 예외처리는 throws가 없는 호출메소드

  • 예외 되던지기(re-throwing)
    예외 처리 후 고의적으로 예외를 다시 발생시켜 호출한 메소드로 전달한다. 양쪽에서 예외를 처리해야할 경우 사용한다.

연결된 예외

  • 여러 개의 예외를 하나의 큰 예외로 묶어 처리할 떄

  • checked예외(Exception)를 unchecked 예외(Runtime Exception)으로 처리할 때

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.