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

PHP 7의 예외(Exception)와 오류(Error) 처리 완벽 가이드

PHP 7 이전 버전에서는 예외(Exception)만 처리할 수 있었고, 오류(Error)는 처리할 수 없었습니다. 치명적 오류(Fatal Error)가 발생하면 애플리케이션 전체 또는 일부가 강제로 중단되는 문제가 있었습니다.

이러한 문제를 해결하기 위해 PHP 7에서는 Throwable 인터페이스가 새롭게 도입되어 예외와 오류를 모두 처리할 수 있게 되었습니다.

예외(Exception)와 오류(Error)의 차이

예외(Exception)

치명적이면서 복구 가능한 오류가 발생하면, PHP 7은 스크립트 전체 실행을 중단하는 대신 예외를 던집니다(throw). 이를 통해 개발자는 try/catch 블록으로 오류 상황을 우아하게 처리하고 프로그램 실행을 이어갈 수 있습니다.

오류(Error)

PHP 7은 TypeError, ArithmeticError, ParserError, AssertionError 등의 오류를 던지지만, 기존의 경고(warning)와 알림(notice) 오류는 그대로 유지됩니다. try/catch 블록을 사용하면 Error 인스턴스도 잡아낼 수 있으며, 이제 치명적 오류(Fatal Error) 역시 Error 인스턴스를 던집니다.

정리하면, PHP 7에 추가된 Throwable 인터페이스ExceptionError라는 두 개의 예외 계층 구조를 하나로 통합하여 Throwable을 구현합니다.

예제: Error 객체 catch하기

<?php
    class XYZ {
        public function Hello() {
            echo "class XYZ\n";
        }
    }
    try {
        $a = new XYZ();
        $a->Hello();
        $a = null;
        $a->Hello();
    }
    catch (Error $e) {
        echo "Error occurred" . PHP_EOL;
        echo $e->getMessage() . PHP_EOL;
        echo "File: " . $e->getFile() . PHP_EOL;
        echo "Line: " . $e->getLine() . PHP_EOL;
    }
    echo "Continue the PHP code\n";
?>

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

class XYZ
Error occurred
Call to a member function Hello() on null
File: /home/cg/root/9008538/main.php
Line: 11
Continue with the PHP code

참고: 위 예제에서는 null 객체에 대해 메서드를 호출했습니다. catch 블록이 이 오류를 처리한 후, PHP 코드의 나머지 부분이 정상적으로 계속 실행되는 것을 확인할 수 있습니다.

산술 오류(Arithmetic Error)

산술 오류 중 하나인 DivisionByZeroError를 살펴보겠습니다. 단, 나눗셈 연산자(/)를 사용할 경우에는 여전히 경고(warning) 오류가 발생한다는 점에 유의해야 합니다.

예제: 산술 오류 처리

<?php
    $x = 10;
    $y = 0;
    try {
        $z = intdiv($x , $y);
    }
    catch (DivisionByZeroError $e) {
        echo "Error has occured\n";
        echo $e->getMessage() . PHP_EOL;
        echo "File: " . $e->getFile() . PHP_EOL;
        echo "Line: " . $e->getLine() . PHP_EOL;
    }
    echo "$z \n";
    echo " continues with the PHP code\n";
?>

실행 결과

위 프로그램은 경고 오류와 함께 다음과 같이 실행됩니다.

Division by zero
File: /home/cg/root/9008538/main.php
Line: 5
continues with the PHP code

참고: 위 프로그램에서는 intdiv() 함수 내부에서 발생한 DivisionByZeroError를 catch 블록으로 잡아내어 보고하고 있습니다. 이처럼 PHP 7의 Throwable 인터페이스를 활용하면 0으로 나누기와 같은 치명적인 산술 오류도 안전하게 처리할 수 있습니다.