예외 처리 블록의 중첩

예외 처리 블록의 중첩

try...excepttry...finally는 단독으로만 쓰는 게 아니라 서로 겹쳐서(중첩해서) 쓸 수 있어요. 이때 프로그램 흐름이 어떻게 진행되는지 이해하면 복잡한 예외 처리도 쉽게 설계할 수 있습니다.

출처: Free Pascal Reference — Exception handling nesting

본문

try...Except 블록과 try...Finally 블록을 중첩하는 것이 가능해요. 프로그램 흐름은 LIFO(후입선출, Last In First Out) 원리에 따라 진행돼요. 즉 가장 나중에 만난 try...Except 또는 try...Finally 블록의 코드가 먼저 실행돼요.

예외가 잡히지 않았거나 finally 문이었다면, 프로그램 흐름은 그 바로 앞(마지막에서 두 번째) 블록으로 넘어가요. 이런 식으로 블록이 끝날 때까지 계속 반복돼요.

만약 예외가 발생했는데 그 예외를 처리해 줄 핸들러가 없다면, 런타임 오류 217이 생성돼요. SysUtils 유닛을 사용할 때는 기본 핸들러가 설치되는데, 이 핸들러가 예외 객체의 메시지와 예외가 발생한 주소를 보여준 다음 Halt 명령으로 프로그램을 종료해요.

더 알아보기

  • try...finally 문의 기본 동작은 "try...finally 문" 문서에서 다뤄요.
  • SysUtils 유닛의 예외 클래스와 기본 핸들러는 "예외 클래스" 문서를 참고해요.