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