본문 바로가기
Java/Exception

예외 처리

by Backchus 2020. 7. 2.

예외 처리

예외 개요

컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 자바에서는 에러(error)라고 한다. 에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM 위에서 실행되는 프로그램을 아무리 견고하게 만들어도 결국 실행 불능이 된다. 개발자는 이런 에러에 대처할 방법이 전혀 없다. 자바에서는 에러 이외에 예외(exception)라고 부르는 오류가 있다. 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하다. 그러나 예외는 예외 처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

예외에는 두 가지 종류가 있다.

  • 일반 예외: 컴파일러 체크 예외라고도 하는데, 자바 소스를 컴파일하는 과정에서 예외 처리 코드가 필요한지 검사하기 때문이다. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생한다.

  • 실행 예외: 컴파일하는 과정에서 예외 처리 코드를 검사하지 않는 예외를 말한다.


오류(error)와 예외(exception)

자바 프로그램을 작성할 때 자바 문법에 맞지 않게 코드를 작성하고 컴파일하려고 하면, 자바 컴파일러는 문법 오류(syntax error)를 발생시킵니다. 또한, 자바 문법에는 맞게 작성되었다 하더라도 프로그램이 실행되면서 예상하지 못한 오류가 발생할 수 있습니다. 이렇게 컴퓨터 시스템이 동작하는 도중에 예상하지 못한 사태가 발생하여 실행 중인 프로그램이 영향을 받는 것을 오류(error)와 예외(exception) 두 가지로 구분할 수 있습니다.

  • 오류(error): 시스템 레벨에서 프로그램에 심각한 문제를 야기하여 실행 중인 프로그램을 종료시킵니다. 이러한 오류는 개발자가 미리 예측하여 처리할 수 없는 것이 대부분이므로, 오류에 대한 처리는 할 수 없습니다.

  • 예외(exception): 오류와 마찬가지로 실행 중인 프로그램을 비정상적으로 종료시키지만, 발생할 수 있는 상황을 미리 예측하여 프로그램을 종료시키지 않고 처리할 수 있습니다. 따라서 개발자는 예외 처리(exception handling)를 통해 예외 상황을 처리할 수 있도록 코드의 흐름을 바꿀 필요가 있습니다.


예외 처리

자바에서는 프로그램이 실행되는 도중 발생하는 예외를 처리하기 위해 try / catch / finally 문을 사용할 수 있습니다.

try {

    예외를 처리하길 원하는 실행 코드;

} catch (e1) {

    e1 예외가 발생할 경우에 실행될 코드;

} catch (e2) {

    e2 예외가 발생할 경우에 실행될 코드;

}

...

finally {

    예외 발생 여부와 상관없이 무조건 실행될 코드;

}
  1. try 블록 : 기본적으로 맨 먼저 실행되는 코드로 여기에서 발생한 예외는 catch 블록에서 처리됩니다.
  2. catch 블록 : try 블록에서 발생한 예외 코드나 예외 객체를 인수로 전달받아 그 처리를 담당합니다.
  3. finally 블록 : 이 블록은 try 블록에서 예외가 발생하건 안 하건 맨 마지막에 무조건 실행됩니다.

예외 처리 메커니즘

자바에서는 예외 처리는 다음과 같은 순서로 진행 됩니다.

  1. try 블록에 도달한 프로그램의 제어는 try 블록 내의 코드를 실행합니다. 이때 만약 예외가 발생(throw)하지 않고, finally 블록이 존재하면 프로그램의 제어는 바로 finally 블록으로 이동합니다.

  2. try 블록에서 예외가 발생하면 catch 핸들러는 다음과 같은 순서로 적절한 catch 블록을 찾게 됩니다.

    2-1. 스택에서 try 블록과 가장 가까운 catch 블록부터 차례대로 검사합니다.

    2-2. 만약 적절한 catch 블록을 찾지 못하면, 바로 다음 바깥쪽 try 블록 다음에 위치한 catch 블록을 차례대로 검사합니다.

    2-3. 이러한 과정을 가장 바깥쪽 try 블록까지 계속 검사하게 됩니다.

    2-4. 그래도 적절한 catch 블록을 찾지 못하면, 예외는 처리되지 못합니다.

  3. 만약 적절한 catch 블록을 찾게 되면, throw 문의 피연산자는 예외 객체의 형식 매개변수로 전달됩니다.

  4. 모든 예외 처리가 끝나면 프로그램의 제어는 finally 블록으로 이동합니다.

  5. finally 블록이 모두 처리되면, 프로그램의 제어는 예외 처리문 바로 다음으로 이동합니다.

다음 그림은 위에서 설명한 예외 처리 메커니즘을 그림으로 표현한 것입니다.

만약 1번 try 블록에서 예외가 발생하지 않고, 바깥쪽 try 블록에서도 예외가 발생하지 않으면, 6번 finally 블록이 바로 실행될 것입니다.

하지만 1번 try 블록에서 예외가 발생하면, 2번과 3번 catch 블록에서 해당 예외를 처리할 수 있는지 검사하게 됩니다. 만약 적절한 catch 블록을 찾지 못하면, 바깥쪽 try 블록의 4번과 5번 catch 블록도 차례대로 검사하게 됩니다.

이때 해당 예외를 처리할 수 있는 catch 블록을 찾게 되면, 해당 catch 블록을 실행한 후 6번 finally 블록을 실행합니다.

하지만 모든 catch 블록이 해당 예외를 처리할 수 없으면, 예외는 처리되지 못한 채 해당 프로그램은 강제 종료될 것입니다.

참고 자료: http://tcpschool.com/java/java_exception_intro

'Java > Exception' 카테고리의 다른 글

예외 발생 및 회피  (0) 2020.07.02
예외 클래스  (0) 2020.07.02