오류 처리(3)

minah moon·2023년 8월 28일

PHP

목록 보기
40/58
post-thumbnail

try... catch로 예외 처리

만약에 예외적인 상황에서 일부 코드가 예외를 발생할 수 있으며, 그 문제를 복구할 수 있다는 것을 알고 있다면 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

0개의 댓글