개요
PHP에서는 try-catch 블록을 원하는 만큼 여러 단계로 중첩하여 사용할 수 있습니다. 이때 예외는 작성된 순서의 역순으로 처리되며, 즉 가장 안쪽에 위치한 예외부터 먼저 처리됩니다.
중첩 구조에서 내부 try 블록의 catch 절이 해당 예외를 잡지 못하면, 예외는 자동으로 외부 try-catch 블록으로 전파됩니다. 이러한 특성을 활용하면 오류 유형별로 세분화된 예외 처리 로직을 구성할 수 있습니다.
예제
다음 예제에서는 두 개의 try-catch 블록이 중첩되어 있습니다.
- 내부 try 블록: 두 변수 중 하나라도 숫자가 아닌 값이면 사용자 정의 예외인
myException을 던집니다. - 외부 try 블록: 분모가 0이면 DivisionByZeroError를 던지고, 그렇지 않으면 두 수의 나눗셈 결과를 출력합니다.
<?php
class myException extends Exception{
function message(){
return "error : " . $this->getMessage() . " in line no " . $this->getLine();
}
}
$x = 10;
$y = 0;
try {
// 내부 try 블록
try {
if (is_numeric($x) == FALSE || is_numeric($y) == FALSE)
throw new myException("Non numeric data");
}
catch (myException $m) {
echo $m->message();
return;
}
if ($y == 0)
throw new DivisionByZeroError("Division by 0");
echo $x / $y;
}
catch (DivisionByZeroError $e) {
echo $e->getMessage() . " in line no " . $e->getLine();
}
?>실행 결과
$y가 0인 경우 다음과 같은 출력이 표시됩니다.
Division by 0 in line no 19
변수 중 하나를 숫자가 아닌 값(예: 문자열)으로 변경하면 내부 예외가 먼저 처리되어 다음과 같이 출력됩니다.
error : Non numeric data in line no 20
정리
두 변수가 모두 숫자이면 나눗셈 결과가 정상적으로 출력됩니다. 이처럼 중첩된 try-catch 구조를 사용하면 데이터 유효성 검사와 같은 세부적인 오류는 내부 블록에서, 치명적인 연산 오류는 외부 블록에서 처리하는 등 계층적인 예외 관리가 가능합니다. 예외는 안쪽에서 바깥쪽으로 전파된다는 점을 기억하면 복잡한 애플리케이션에서도 체계적인 오류 처리 흐름을 설계할 수 있습니다.