소개
PHP 7 이전 버전에서는 파서가 다양한 조건에 반응해 오류를 보고했으며, 각 오류는 미리 정의된 특정 유형에 속했습니다. 그러나 PHP 7은 오류 보고 메커니즘을 크게 개선했습니다. 기존의 전통적인 오류 보고 방식 대신, 대부분의 오류는 이제 오류 예외(Error Exception)를 던지는 방식으로 처리됩니다.
이렇게 발생한 오류 예외를 별도로 처리하지 않으면 치명적 오류(Fatal Error)가 보고되며, 이는 기존의 전통적인 오류 조건과 동일하게 취급됩니다. PHP의 오류 계층 구조는 Throwable 인터페이스에서 출발합니다. ArithmeticError, AssertionError, CompileError, TypeErorr와 같은 모든 사전 정의된 오류 클래스는 Throwable 인터페이스를 구현하며, PHP 7의 Exception 클래스 역시 Throwable 인터페이스를 구현합니다.
Throwable 인터페이스는 Error 객체와 Exception 객체를 포함하여 throw 문을 통해 던질 수 있는 모든 객체의 기반이 됩니다. 단, 사용자 정의 클래스는 Throwable 인터페이스를 직접 구현할 수 없습니다. 사용자 정의 예외 클래스를 선언하려면 반드시 Exception 클래스를 상속(extends)해야 합니다.
예외 처리의 기본 구조: try, catch, throw
PHP의 예외 처리는 throw, catch, try 세 가지 문으로 구성됩니다. 예외 객체를 발생시킬 때는 throw 키워드를 사용하고, 던져진 예외는 catch 블록에서 처리합니다. 예외가 발생할 가능성이 있는 코드는 try 블록 안에 감싸서 작성합니다.
서로 다른 Exception 클래스의 인스턴스를 처리하기 위해 하나 이상의 catch 블록을 사용할 수 있습니다. try 블록에서 예외가 발생하지 않으면 마지막 catch 블록 이후부터 정상적인 코드 실행이 계속됩니다. 반면, try 블록 내부에서 예외가 던져지면 다음 문장을 실행하는 대신, PHP는 발생한 예외 유형과 일치하는 catch 블록을 찾아 해당 코드를 실행합니다.
만약 일치하는 catch 블록이 정의되어 있지 않다면, PHP 파서는 Fatal error: Uncaught Exception(처리되지 않은 예외) 메시지와 함께 치명적 오류를 보고하며 스크립트 실행이 중단됩니다.
finally 블록 활용하기
catch 블록 뒤에 또는 catch 블록 대신 finally 블록을 추가할 수도 있습니다. finally 블록 안의 코드는 try 블록 내에서 예외가 발생하든 발생하지 않든 항상 실행됩니다. 따라서 데이터베이스 연결 해제, 파일 핸들 닫기 등 리소스 정리 작업이 필요한 경우 finally 블록을 활용하면 코드의 안정성과 가독성을 동시에 높일 수 있습니다.