본문 바로가기
PHP

[PHP] 사용자 정의 예외 처리기[set_exception_handler()] 정의하기

by teamnova 2023. 11. 10.
728x90

오늘은  PHP에서 스크립트 실행 중 발생하는 예외 중 예상치 못해 try/catch 구문으로 잡지 못하는 예외가 생겼을 때 예외 처리를 하게 만들어주는 메소드에 알아보고 예제를 만들어 보겠습니다.

 

사용자 정의 오류 처리기는 다음과 같이 등록할 수 있습니다.

set_exception_handler(?callable $callback): ?callable

$callback : 콜백 메소드는 해당 예외를 잡았을 때 실행할 메소드를 설정

set_exception_handler() 메소드는 set_error_handler() 메소드와 달리 콜백 메소드가 실행된 뒤 스크립트 실행이 중지됩니다.

 

콜백 메소드는 다음과 같이 정의할 수 있습니다.

handler(Throwable $ex): void

EXAMPLE
function myExceptionHandler($ex){
	// code to execute
}

$ex: 발생한 예외에 대한 정보를 갖고 있는 변수를 전달

 

 

위 내용을 바탕으로 예제를 하나 만들어 보겠습니다.

// 사용자 정의 예외핸들러
function myExceptionHandler(Throwable $ex) {
  // 에러 발생 메시지 출력
  echo "Uncaught exception: " , $ex->getMessage(), "\n";
  
  // 메시지 출력 이후 발생한 예외 관련 로그를 남기기 위한 코드를 작성 
  
  $logDate = date("Ymd"); // 오늘의 날짜를 변수로 저장
  $dirName = "log"; // 로그 폴더 이름 저장
  
  // log 폴더 존재 확인
  if(is_dir($dirName)){
	opendir($dirName); // log 폴더가 존재한다면 폴더 열기
  }else{
	mkdir($dirName) // log 폴더가 존재하지 않는다면 생성
  }
  
  // 오늘 날짜로 log 파일 이름 설정
  $fileName = $logData."log";
  
  // fopen() 메소드를 사용해 이미 파일이 있다면 추가로 작성
  // 파일이 없다면 새로 생성해 작성
  $fp = fopen("./log/".$fileName, 'a+');
  
  // log 파일 기록 시작
  fwrite( $fp,"************************************************\r\n");
  fwrite( $fp,"예외발생일시	: ".date("YmdHis")."\r\n");
  fwrite( $fp,"예외 코드	: ".$ex->getCode()."\r\n");
  fwrite( $fp,"예외 메시지	: ".$ex->getMessage()."\r\n");
  fwrite( $fp,"예외 발생 파일이름	: ".$ex->getFile()."\r\n");
  fwrite( $fp,"예외 발생한 줄	: ".$ex->getLine()."\r\n");
  
  // log 파일 작성 종료
  fclose($fp);
}

// 사용자 정의 예외핸들러 설정
set_exception_handler('myExceptionHandler');

// 사용자 정의 예외 핸들러를 테스트하기 위해 try/catch 구문 없이 의도적인 예외 발생
throw new Exception('Uncaught Exception');

echo "Not Executed\n"; // 사용자 정의 예외핸들러 메소드 내부 코드가 실행되고 난 뒤
		       // 스크립트가 중지되어 절대로 실행될 수 없는 코드

이렇게 set_exception_handler() 메소드를 사용해서 사용자가 예상치 못한 상황에 예외가 발생했더라도 log를 통해 기록을 남겨 추후 예외처리를 할 수 있게 도와주는 방법을 알아보았습니다.

다음에는 스크립트 실행이 완료되거나 중지되었을 때 특정 메소드를 실행하는 register_shutdown_function() 사용법을 알아보겠습니다.