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() 사용법을 알아보겠습니다.
'PHP' 카테고리의 다른 글
[PHP] 위도, 경도 값을 활용하여 거리순으로 출력하기 (2) | 2023.11.25 |
---|---|
[PHP] ERROR 대비 종료 시 실행할 메소드 설정하기 (0) | 2023.11.19 |
[PHP] 사용자 정의 오류 처리기[set_error_handler()] 정의하기 (0) | 2023.10.31 |
[PHP] Retrofit 라이브러리를 사용해서 서버에 파일 업로드하기(서버) (0) | 2023.10.20 |
[PHP] 커스텀 토스트 메시지 띄우기 (0) | 2023.07.06 |