본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Exception Handling
프로그램 실행 중 발생하는 예외(비정상 상황)를 감지하고, 정상 흐름을 유지하거나 안전하게 종료하도록 처리하는 기법
  • 예외의 예: 0으로 나누기, 배열 범위 초과, 존재하지 않는 파일 열기, 잘못된 형식의 입력
  • 예외를 처리하지 않으면 프로그램이 비정상 종료된다.
  • C 언어는 예외 처리 구문이 없어 반환값이나 errno로 오류를 확인한다.
  • try: 예외가 발생할 수 있는 코드
  • catch: 발생한 예외 유형별 처리. 위에서부터 순서대로 비교하므로 하위 클래스를 먼저 쓴다.
  • finally: 예외 발생 여부와 관계없이 항상 실행. try나 catch에 return 이 있어도 실행된다.
  • throw: 예외를 직접 발생시킨다. 예: throw new IllegalArgumentException();
  • throws: 메서드 선언부에 붙여 예외 처리를 호출한 쪽으로 넘긴다.
  • 관련 문서: 자바 try catch 구문

체크 예외와 언체크 예외

편집 원본 편집
구분 체크 예외(Checked) 언체크 예외(Unchecked)
상속 Exception 하위(RuntimeException 제외) RuntimeException 하위
처리 강제 컴파일러가 try-catch 또는 throws 를 강제 강제하지 않음
예 IOException, SQLException, ClassNotFoundException ArithmeticException, NullPointerException
  • Error(OutOfMemoryError 등)는 시스템 수준의 심각한 문제로 애플리케이션에서 처리하지 않는 것이 원칙이며, 역시 언체크이다.

주요 예외 클래스

편집 원본 편집
예외 발생 상황
ArithmeticException 정수를 0으로 나눔
NullPointerException null 참조 변수의 멤버 접근
ArrayIndexOutOfBoundsException 배열 인덱스 범위 초과
NumberFormatException 숫자로 변환할 수 없는 문자열 변환(Integer.parseInt("12a"))
ClassCastException 호환되지 않는 형으로 캐스팅
IOException 입출력 실패(체크 예외)

출력 순서 예제

편집 원본 편집
public class Main {
    static int test() {
        try {
            System.out.println("try");
            int x = 10 / 0;
            System.out.println("unreached");
            return 1;
        } catch (ArithmeticException e) {
            System.out.println("catch");
            return 2;
        } finally {
            System.out.println("finally");
        }
    }
    public static void main(String[] args) {
        System.out.println(test());
        int[] arr = new int[3];
        try {
            arr[3] = 1;
        } catch (ArithmeticException e) {
            System.out.println("A");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("B");
        } catch (Exception e) {
            System.out.println("C");
        } finally {
            System.out.println("D");
        }
        System.out.println("E");
    }
}
  • 출력: try → catch → finally → 2 → B → D → E (각각 한 줄)
  • catch 의 return 2 는 finally 가 실행된 뒤에 반환된다. 일치하는 첫 catch 하나만 실행된다.
  • try-except-else-finally 구조이다. else 는 예외가 없을 때만, finally 는 항상 실행된다.
  • raise 로 예외를 발생시킨다. 주요 예외: ZeroDivisionError, IndexError, KeyError, ValueError, TypeError, FileNotFoundError
def f(x):
    try:
        r = 10 / x
    except ZeroDivisionError:
        print("except")
    else:
        print("else", r)
    finally:
        print("finally")

f(2)   # else 5.0 → finally
f(0)   # except → finally
BEGIN
  SELECT ename INTO v_name FROM emp WHERE empno = 9999;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    DBMS_OUTPUT.PUT_LINE('데이터 없음');
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

시큐어 코딩 관점

편집 원본 편집
  • 소프트웨어 개발보안 가이드의 보안약점 유형 중 에러처리에 해당한다. 관련 문서: 시큐어 코딩
  • 오류 메시지 정보노출: 스택 트레이스, DB 오류 등 내부 정보가 사용자에게 노출됨
  • 오류상황 대응 부재: 예외를 잡고도 아무 조치를 하지 않음(빈 catch 블록)
  • 부적절한 예외 처리: 광범위한 예외(Exception)로 한꺼번에 처리하거나 반환값을 검사하지 않음
  • try-catch-finally 에서 return 이 있을 때의 출력 순서를 묻는다.
  • 체크 예외와 언체크 예외를 구분하고, 예외 클래스와 발생 상황을 연결한다.
  • Python의 else 절은 예외가 없을 때만 실행된다.