개요
PHP에서 try 블록이나 catch 블록(또는 둘 다)에 return 문이 포함되어 있을 때 finally 블록은 독특한 동작을 보입니다. 일반적으로 return 문을 만나면 프로그램의 제어 흐름이 즉시 호출 위치로 되돌아갑니다. 그러나 try/catch 구조 안에 return 문이 존재하는 경우에는, 함수가 실제로 값을 반환하기 전에 finally 블록의 코드가 반드시 먼저 실행됩니다.
즉, return 문이 실행되더라도 finally 블록은 절대 건너뛰어지지 않습니다. 이러한 특성 덕분에 finally 블록은 파일 핸들 닫기, 데이터베이스 연결 해제 등 리소스 정리 작업을 수행하는 데 매우 유용하게 활용됩니다.
예제
다음 예제의 div() 함수는 try-catch-finally 구조를 사용합니다. 예외가 발생하지 않으면 try 블록이 나눗셈 결과를 반환하고, 예외가 발생하면 catch 블록이 오류 메시지를 반환합니다. 하지만 어느 경우든 finally 블록의 문장이 반환 처리보다 먼저 실행된다는 점에 주목하세요.
<?php
function div($x, $y){
try {
if ($y==0)
throw new Exception("Division by 0");
else
$res=$x/$y;
return $res;
}
catch (Exception $e){
return $e->getMessage();
}
finally{
echo "This block is always executed\n";
}
}
$x=10;
$y=0;
echo div($x,$y);
?>
실행 결과
$y 값이 0일 때는 0으로 나누려는 시도가 예외를 발생시키므로, catch 블록의 오류 메시지가 반환됩니다. 다음과 같은 출력이 표시됩니다.
This block is always executed
Division by 0
이제 $y 값을 5로 변경하면 예외 없이 정상적으로 나눗셈이 수행되어 try 블록의 결과값이 반환됩니다.
This block is always executed
2
핵심 정리
두 경우 모두 finally 블록의 메시지가 결과값보다 먼저 출력된 것을 확인할 수 있습니다. 이는 return 문이 제어 흐름을 호출자에게 넘기기 전에 finally 블록이 항상 우선 실행되기 때문입니다. 따라서 예외 발생 여부와 관계없이 반드시 수행해야 하는 마무리 작업이 있다면 finally 블록에 배치하는 것이 올바른 방법입니다.