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 인터페이스는 Exception과 Error라는 두 개의 예외 계층 구조를 하나로 통합하여 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으로 나누기와 같은 치명적인 산술 오류도 안전하게 처리할 수 있습니다.