try...except 문
try...except 문
try...except 블록은 예외를 잡아 처리하는 가장 기본적인 예외 처리 구조예요. 예외가 발생했을 때 어떤 처리기가 실행되는지, 그리고 예외 객체가 어떻게 다뤄지는지 이해하는 것이 핵심입니다.
출처: 문서
본문
try...except 예외 처리 블록은 다음 형태를 가집니다.
Try statement → try statement list except exception handlers end
Exception handlers → exception handler {; exception handler} [else statement list]
Exception handler → on [identifier :] class type identifier do statement
statement list를 실행하는 동안 예외가 발생하지 않으면, 목록의 모든 문장이 순서대로 실행되고 except 블록은 건너뛰며, 프로그램 흐름은 마지막 end 다음의 문장으로 이동해요.
statement list를 실행하는 동안 예외가 발생하면 프로그램 흐름은 except 블록으로 이동합니다. 예외가 발생한 지점과 예외 블록 사이에 있는 문장 목록의 문장들은 무시돼요.
예외 처리 블록에서는 예외의 타입을 검사해요. 예외 객체 타입과 일치하거나, 그 예외 객체 타입의 부모 타입인 클래스 타입을 가진 예외 처리기가 있으면, 해당 do 다음에 오는 문장이 실행됩니다. 일치하는 첫 번째 타입이 사용돼요. do 블록이 실행된 후 프로그램은 end 문 다음에서 계속됩니다.
예외 처리 문장의 식별자는 선택적이며, 예외 객체를 선언해요. 예외 처리 코드에서 예외 객체를 조작하는 데 사용할 수 있습니다. 이 선언의 스코프는 do 키워드 다음의 문장 블록입니다.
on 처리기가 예외 객체 타입과 일치하는 것이 없으면, else 다음의 문장 목록이 실행돼요. 그런 목록이 없으면 예외는 자동으로 다시 발생(재발생)됩니다. 이 과정을 통해 try...except 블록을 중첩할 수 있어요.
반대로 예외가 잡혔다면, 예외 객체는 예외 처리 블록의 끝에서, 프로그램 흐름이 계속되기 전에 파괴됩니다. 예외는 객체의 Destroy 소멸자 호출을 통해 파괴돼요.
예시
앞선 DoDiv 함수 선언이 있다고 할 때, 다음을 고려해 보세요.
Try
Z := DoDiv (X,Y);
Except
On EDivException do Z := 0;
end;
만약 Y가 0이면, DoDiv 함수 코드가 예외를 발생시켜요. 이때 프로그램 흐름은 except 문으로 이동하고, 예외 처리기가 Z의 값을 0으로 설정합니다. 예외가 발생하지 않으면 프로그램 흐름은 마지막 end 문을 지나 계속돼요.
try...finally
오류 복구를 허용하기 위해 Try...Finally 블록도 지원돼요. Try...Finally 블록은 Finally 키워드 다음의 문장이, 예외가 발생하더라도, 반드시 실행되도록 보장합니다.
더 알아보기
- Free Pascal Reference Manual 17장 예외 처리
- raise 문
- Free Pascal Reference Manual 17.5절 예외 클래스