try...finally 문
try...finally 문
자원(파일, 메모리 등)을 쓴 뒤에는 반드시 정리를 해야 하는데, 중간에 예외가 나면 그 정리가 생략되기 쉽죠. Free Pascal의 try...finally 문은 예외가 발생하든 안 하든 종료 직전에 꼭 실행할 코드를 보장해 주는 블록이에요. 리소스 해제가 안전해지는 가장 기본적인 예외 처리 문법입니다.
본문
try...finally 문은 다음과 같은 형태를 가져요.
Procedure Doit (Name : string);
Var F : Text;
begin
Assign (F,Name);
Rewrite (name);
Try
... File handling ...
Finally
Close(F);
end;
end;
statement List(본문) 안에서 예외가 발생하지 않으면, 뭔가 예외적인 게 없을 때 Try, Finally, End 키워드가 없던 것처럼 프로그램이 그대로 실행돼요. 단, exit 명령이 주어진 경우는 달라요. exit는 실제로 함수를 빠져나가기 전에 먼저 finally 블록 안의 모든 문장을 실행해 주거든요.
하지만 예외가 발생하면, 프로그램 흐름은 예외가 발생한 지점에서 즉시 Finally 문의 첫 번째 문장으로 넘어가요.
finally 키워드 뒤에 나온 문장이 전부 실행된 다음, 예외는 자동으로 다시 던져져요(raise). 예외가 발생한 지점과 Finally 문의 첫 번째 문장 사이에 있던 문장들은 건너뛰어져요.
다음 루틴을 예로 들어 볼게요.
만약 파일 처리 도중 예외가 발생하면, 프로그램 흐름은 close(F) 문장으로 이어져요. 예외가 발생한 지점과 Close 문장 사이에 있을 수 있는 다른 파일 연산들은 건너뛰는 거죠. 예외가 발생하지 않았다면 모든 파일 연산이 실행되고, 마지막에 파일이 닫혀요.
try..finally 블록 안에 포함된 Exit 문은 여전히 finally 블록을 실행한다는 점에 주의해야 해요. 앞의 예를 다시 써 볼게요.
Procedure Doit (Name : string);
Var
F : Text;
B : Boolean;
begin
B:=False;
Assign (F,Name);
Rewrite (name);
Try
// ... File handling ...
if B then
exit; // Stop processing prematurely
// More file handling
Finally
Close(F);
end;
end;
Exit 문으로 처리를 일찍 끝내더라도 파일은 여전히 닫혀요. 이렇게 finally 블록이 정리 코드의 실행을 보장해 주는 거예요.
더 알아보기
- Free Pascal Reference의 "Exception handling nesting"에서 블록을 중첩했을 때의 동작을 확인할 수 있어요.
try...except와try...finally의 차이를 함께 보면 예외 처리 설계가 더 명확해져요.