
만약에 예외적인 상황에서 일부 코드가 예외를 발생할 수 있으며, 그 문제를 복구할 수 있다는 것을 알고 있다면 try... catch 문을 사용하여 그 상황을 처리할 수 있다.
try 블록 안에서 예외가 발생하면 PHP 인터프리터는 다음을 수행한다.
코드 실행을 중지한다.
뒤에 와야 하는 catch 블록을 찾는다.
해당 catch 블록이 그 상황을 처리할 수 있는지 확인한다(왜냐하면 예외 객체나 그것이 구현하는 인터페이스를 생성하는 데 사용하는 클래스의 이름을 지정하기 때문이다).
처리할 수 있다면, 해당 catch 블록의 구문을 실행한다.
catch 키워드 다음의 괄호 안에 다음을 지정한다.
예외 객체 또는 그것이 구현하는 인터페이스를 생성하는 데 사용되는 클래스
catch 블록에서 예외 객체를 보유할 변수의 이름(보통 $e라고 함)
try { // 예외를 던질 수 있는 작업을 시도한다. } catch (ExceptionClassName $e) { // 예외가 발생하면 이 예외를 처리하기 위한 작업을 수행한다. } finally () { // 예외가 발생했는지 여부와 상관없이 작업을 수행한다. }
PHP 인터프리터는 try 블록에서 발생하지 않았거나 catch 블록에서 지정한 클래스를 사용하지 않아서 catch 블록에서 처리되지 않은 예외를 처리하기 위해 사용자 정의 함수를 실행할 수 있다.
디폴트 예외 핸들러
예외가 catch 블록에서 처리되지 않을 때 PHP 인터프리터가 호출해야 하는 사용자 정의 함수
set_exception_handler('name')
PHP의 내장 함수인 set_exception_handler()는 호출할 사용자 정의 함수의 이름을 지정한다. 이 함수는 함수명을 하나의 매개변수로 받는다. 함수명 뒤에 괄호가 오면 안 된다.
기본 예외 처리 함수는 다음의 작업을 한다.
오류 로그 파일에 문제에 대한 세부 정보를 추가한다.
올바른 HTTP 응답 코드(500)를 설정한다.
메시지를 사용자에게 표시한다.
페이지에서 더 이상의 코드 실행을 중지한다.
function handle_exception($e) { error_log($e); http_response_code(500); echo '<h1>Sorry, an error occurred please try again later.</h1>'; exit; }
웹 서버가 요청된 파일을 찾을 수 없거나 서버 오류로 브라우저의 요청을 처리할 수 없다면, 웹 서버는 오류 코드와 웹 페이지를 브라우저에 다시 보낸다.
서버가 요청된 파일과 함께 브라우저에 보내는 HTTP 헤더 중 하나는 요청이 성공했는지를 나타내는 응답 상태 코드response status code다.
서버가 요청을 성공적으로 처리하면 요청된 파일과 함께 코드 200을 반환한다.
만약에 요청된 파일을 찾을 수 없으면 문제에 대해 설명하는 오류 페이지와 함께 코드 404를 반환한다.
서버의 오류로 인해 페이지를 표시하지 못하면 코드 500과 내부 서버 오류가 발생했다는 오류 페이지를 반환한다.
요청에 응답할 수 없을 때 웹 서버가 생성하는 오류 페이지는 사용자 친화적이지 않으므로, 서버가 만드는 오류 페이지 대신 전송할 사용자 정의 오류 페이지를 만들 수 있다.
사용자 정의 오류 페이지를 사용하여 방문자에게 문제에 대해 보다 명확한 설명을 줄 수 있다. 또한 사이트의 다른 페이지와 동일한 룩 앤드 필을 사용할 수도 있다.
사용자 정의 오류 페이지를 전송하려면, .htaccess 파일에 ErrorDocument 지시문을 추가하고 다음을 지정한다
이 파일을 사용해야 할 상태 코드
해당 코드에 대해 표시해야 하는 파일 경로
ErrorDocument code replacement-page.php // 지시어, 상태코드, 대신 표시할 페이지
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022