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

PHP 다중 catch 블록을 활용한 예외 처리 방법

개요

PHP에서는 try 블록 하나 뒤에 여러 개의 catch 블록을 연속으로 배치하여, 발생하는 예외의 종류에 따라 각각 다르게 처리할 수 있습니다. 이러한 다중 catch 블록은 PHP에 미리 정의된 내장 예외나 에러뿐만 아니라, 개발자가 직접 정의한 사용자 정의 예외를 처리하는 데에도 활용할 수 있습니다.

각 catch 블록은 처리하고자 하는 예외 클래스 타입을 지정하며, try 블록 내에서 던져진(throw) 예외가 해당 타입과 일치할 때 그 블록의 코드가 실행됩니다. 어떤 catch 블록과도 일치하지 않는 경우를 대비해, 모든 예외의 최상위 클래스인 Exception을 처리하는 범용 catch 블록을 마지막에 두는 것이 좋은 practice입니다.

예제 코드

다음 예제는 DivisionByZeroError, TypeError, ArgumentCountError, InvalidArgumentException 네 가지 상황을 각각의 catch 블록으로 처리하고, 마지막에는 일반적인 Exception을 처리하는 catch 블록도 함께 사용합니다.

<?php
declare(strict_types=1);
function divide(int $a, int $b) : int {
    return $a / $b;
}
$a=10;
$b=0;
try{
    if (!$b) {
        throw new DivisionByZeroError('Division by zero.');}
        if (is_int($a)==FALSE || is_int($b)==FALSE)
            throw new InvalidArgumentException("Invalid type of arguments");
            $result=divide($a, $b);
            echo $result;
        }
        catch (TypeError $x)//if argument types not matching{
            echo $x->getMessage();
    }
    catch (DivisionByZeroError $y) //if denominator is 0{
        echo $y->getMessage();
}
catch (ArgumentCountError $z) //if no.of arguments not equal to 2{
    echo $z->getMessage();
}
catch (InvalidArgumentException $i) //if argument types not matching{
    echo $i->getMessage();
}
catch (Exception $ex) // any uncaught exception{
    echo $ex->getMessage();
}
?>

실행 결과

1. 분모가 0인 경우 — DivisionByZeroError

$b가 0이므로 0으로 나누는 오류가 먼저 발생하여 해당 메시지가 출력됩니다.

Division by 0

2. 반환 타입 불일치 — TypeError

$b를 3으로 변경하면, divide() 함수는 정수(integer)를 반환하도록 선언되어 있지만 실제 나눗셈 결과는 실수(float)가 되므로 TypeError가 발생합니다.

Return value of divide() must be of the type integer, float returned

3. 인자 개수 부족 — ArgumentCountError

호출부를 $res=divide($a);처럼 변경하여 인자를 하나만 전달하면, 함수가 요구하는 인자 개수와 맞지 않아 ArgumentCountError가 발생합니다.

Too few arguments to function divide(), 1 passed in C:\xampp\php\test1.php on line 13 and exactly 2 expected

4. 잘못된 인자 타입 — InvalidArgumentException

전달된 인자 중 하나라도 정수가 아니면 InvalidArgumentException이 발생합니다.

Invalid type of arguments

정리

이처럼 PHP의 다중 catch 블록을 활용하면 예외 유형별로 세분화된 에러 처리 로직을 작성할 수 있어, 디버깅이 쉬워지고 프로그램의 안정성이 크게 향상됩니다. 특정 예외부터 구체적으로 처리하고, 가장 일반적인 Exception은 마지막에 배치하는 순서를 지키는 것이 중요합니다.