소개
PHP에서 finally 블록은 try 블록 내에서 예외가 발생하든 발생하지 않든 항상 실행됩니다. 이 블록은 일반적으로 catch 블록 뒤에 위치하거나, 필요에 따라 catch 블록 없이 단독으로도 사용할 수 있습니다.
catch 블록과 finally 블록 함께 사용하기
다음 예제는 catch 블록과 finally 블록을 모두 포함하고 있습니다. try 블록에서 예외가 발생하면 두 블록의 코드가 모두 실행되며, 예외가 발생하지 않으면 finally 블록만 실행됩니다.
예제 1: 예외가 발생하는 경우
<?php
function div($x, $y) {
if (!$y) {
throw new Exception('Division by zero.');
}
return $x/$y;
}
try {
echo div(10,0) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
finally{
echo "This block is always executed\n";
}
// Continue execution
echo "Execution continues\n";
?>출력 결과
Caught exception: Division by zero. This block is always executed Execution continues
위 예제에서는 div(10, 0) 호출 시 0으로 나누기 때문에 예외가 발생하여 catch 블록이 실행된 후, finally 블록과 이후 코드가 순서대로 실행됩니다.
예제 2: 예외가 발생하지 않는 경우
이번에는 try 블록 내부의 구문을 변경하여 예외가 발생하지 않도록 해보겠습니다.
<?php
function div($x, $y) {
if (!$y) {
throw new Exception('Division by zero.');
}
return $x/$y;
}
try {
echo div(10,5) . "\n";
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
finally{
echo "This block is always executed\n";
}
// Continue execution
echo "Execution continues\n";
?>출력 결과
2 This block is always executed Execution continues
예외가 발생하지 않았기 때문에 catch 블록은 건너뛰고 나눗셈 결과인 2가 출력되며, finally 블록은 여전히 실행되는 것을 확인할 수 있습니다.
finally 블록만 단독으로 사용하기
다음 예제는 두 개의 try 블록을 포함합니다. 바깥쪽 try 블록에는 finally 블록만 존재합니다. 이 try 블록은 예외를 던지는 div 함수를 호출하는데, 함수 내부에서 이미 예외를 처리(catch)하고 있으므로 외부로 전파되지 않습니다.
예제 3: 내부 catch와 외부 finally 조합
<?php
function div($x, $y){
try{
if (!$y) {
throw new Exception('Division by zero.');
}
return $x/$y;
}
catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
}
try {
echo div(10,0) . "\n";
}
finally{
echo "This block is always executed\n";
}
// Continue execution
echo "Execution continues\n";
?>출력 결과
Caught exception: Division by zero. This block is always executed Execution continues
정리
finally 블록은 데이터베이스 연결 종료, 파일 핸들 닫기 등 리소스 정리 작업에 특히 유용합니다. 예외 발생 여부와 관계없이 반드시 수행해야 하는 코드를 finally 블록에 작성하면, 프로그램의 안정성과 코드의 신뢰성을 크게 향상시킬 수 있습니다.