Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP 중첩 예외(Nested Exception) 이해하기

개요

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 구조를 사용하면 데이터 유효성 검사와 같은 세부적인 오류는 내부 블록에서, 치명적인 연산 오류는 외부 블록에서 처리하는 등 계층적인 예외 관리가 가능합니다. 예외는 안쪽에서 바깥쪽으로 전파된다는 점을 기억하면 복잡한 애플리케이션에서도 체계적인 오류 처리 흐름을 설계할 수 있습니다.