예외 처리

예외 처리(例外 處理) 또는 오류 처리는 일반적인 실행의 흐름을 바꾸는 몇 가지 조건을 처리하도록 설계한 프로그래밍 언어의 개념이나 컴퓨터 하드웨어 구조를 말한다.

일반적으로 프로그램이 처리되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것을 예외 처리라고 한다.

예외의 원인 
예외의 문제는 보통 다음과 같은 데에서 비롯한다.
 컴퓨터 하드웨어 문제
 운영 체제의 설정 실수
 라이브러리 손상
 사용자의 입력 실수
 존재하지 않는 파일 이름 입력
 숫자값 입력 칸에 일반 문자 입력
 받아들일 수 없는 연산
 할당하지 못하는 기억 장치 접근
 페이지 실패 등

예외 안전 
메모리 누수, 잘못된 출력, 왜곡된 자료와 같이 코드의 런타임 실패가 악영향을 미치지 않는다면, 이러한 코드를 예외 안전이라고 부른다. 몇 가지 수준의 예외 안전은 다음과 같다:
 실패 투명성 (no throw guarantee)
 강력한 불변의 예외 안전 (Commit or rollback semantics)
 기본 예외 안전 (Basic exception safety)
 최소 예외 안전 (no-leak guarantee)
 예외 보증을 하지 않는 안전 (No exception safety)

프로그래밍 언어에서의 예외 지원 
예외를 눈치채지 못하다가 해당 문제를 실제 동작으로 넘길 경우, 치명적인 문제를 일으킬 수 있다. 이를 막으려면 예외가 일어난 부분을 철저하게 검사해야 한다. 다만 프로그램의 크기가 크다면 일반적인 예외 처리보다 더 많은 기술을 요구할 수도 있다.

C++, 에이다, 자바, 자바스크립트와 같은 프로그래밍 언어는 예외 처리 기능을 포함하고 있다. 이러한 언어에서는 예외 처리를 자동화하고 있다. 예외 처리를 담당하는 핸들러를 찾아 순서대로 콜 스택을 거슬러 올라가 올바른 핸들러를 찾아내면 그 곳에 처리를 맡긴다.

Scheme 언어는 기본적으로 예외를 처리하지 않지만 라이브러리 수준에서 예외를 처리할 수 있다. 표준 규격 SRFI-34에 정의되어 있다.

예제 
try {
  line = console.readLine();

  if (line.length() == 0) {
    throw new EmptyLineException("콘솔에서 읽어들인 줄이 비어 있습니다!");
  }

  console.printLine("안녕하세요, %s님!" % line);
  console.printLine("프로그램이 성공적으로 실행되었습니다");
}
catch (EmptyLineException e) {
  console.printLine("안녕하세요!");
}
catch (Exception e) {
  console.printLine("오류: " + e.message());
}
finally {
  console.printLine("프로그램이 지금 종료되었습니다");
}

같이 보기 
 제어 흐름
 예외 처리 문법

외부 링크 
  예외 처리의 문제와 이점
  A Crash Course on the Depths of Win32 Structured Exception Handling by Matt Pietrek - Microsoft Systems Journal (1997)
  exceptions4c: An exception handling framework for C
  Another exception handling framework for ANSI/ISO C

제어 흐름