set_error_handler
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
set_error_handler - 사용자 정의 오류 처리기 함수를 설정합니다.
설명
set_error_handler(?callable $callback
, int $error_levels
= E_ALL
): string|array|object|null
스크립트의 오류를 처리하기 위해 사용자 함수(callback
)를 설정합니다.
이 함수는 런타임 중 오류를 처리하는 고유한 방법을 정의하는 데 사용할 수 있습니다. 예를 들어 치명적인 오류가 발생했을 때 데이터/파일을 정리해야 하거나 특정 조건(사용 trigger_error()).
콜백 함수가 false
를 반환하지 않는 한 표준 PHP 오류 처리기는 error_levels
에 의해 지정된 오류 유형에 대해 완전히 우회된다는 것을 기억하는 것이 중요합니다. error_reporting() 설정은 아무 효과가 없으며 상관없이 오류 처리기가 호출됩니다. 그러나 여전히 error_reporting의 현재 값을 읽고 적절하게 작동할 수 있습니다.
경고 PHP 8.0.0 이전에는 진단을 유발한 표현식 앞에 @error-control 연산자가 추가된 경우 errno
값은 항상 0이었습니다.
또한 필요한 경우 die()를 수행하는 것은 사용자의 책임입니다. 오류 처리기 함수가 반환되면 스크립트 실행은 오류를 일으킨 문 다음의 다음 문으로 계속됩니다.
다음 오류 유형은 사용자 정의 함수로 처리할 수 없습니다. E_ERROR
, E_PARSE
, E_CORE_ERROR
, E_CORE_WARNING
, E_COMPILE_ERROR
, E_COMPILE_WARNING
은 발생한 위치에 관계없이 발생하며 대부분의 E_STRICT
는 set_error_handler()가 호출되는 파일에서 발생합니다.
매개변수
callback
- 다음 서명이 있는 콜백. 이 핸들러를 기본 상태로 재설정하기 위해 대신
null
을 전달할 수 있습니다. 함수 이름 대신에 개체 참조와 메서드 이름을 포함하는 배열을 제공할 수도 있습니다.handler( int $errno, string $errstr, string $errfile = ?, int $errline = ?, array $errcontext = ? ): bool
errno
- 첫 번째 매개변수인
errno
는 발생한 오류 수준을 정수로 전달합니다. errstr
- 두 번째 매개변수인
errstr
은 오류 메시지를 문자열로 전달합니다. errfile
- 콜백이 세 번째 매개변수인
errfile
을 수락하면 오류가 발생한 파일 이름이 문자열로 전달됩니다. errline
- 콜백이 네 번째 매개변수인
errline
을 수락하면 오류가 발생한 행 번호가 정수로 전달됩니다. errcontext
- 콜백이 다섯 번째 매개변수인
errcontext
를 수락하면 오류가 발생한 지점의 활성 기호 테이블을 가리키는 배열이 전달됩니다. 즉,errcontext
는 오류가 발생한 범위에 존재하는 모든 변수의 배열을 포함합니다. 사용자 오류 처리기는 오류 컨텍스트를 수정해서는 안 됩니다.경고 이 매개변수는 PHP 7.2.0부터 DEPRECATED되었으며 PHP 8.0.0부터 제거되었습니다. 함수가 기본값 없이 이 매개변수를 정의하는 경우 호출될 때 "인수 수가 너무 적음" 오류가 발생합니다.
함수가
false
를 반환하면 일반 오류 처리기가 계속됩니다. error_levels
- error_reporting ini 설정이 표시되는 오류를 제어하는 것처럼
callback
함수의 트리거링을 마스크하는 데 사용할 수 있습니다. 이 마스크를 설정하지 않으면 error_reporting 설정에 관계없이 모든 오류에 대해callback
이 호출됩니다.
반환 값
이전에 정의된 오류 처리기를 반환합니다(있는 경우). 내장 오류 처리기가 사용되면 null이 반환됩니다. 이전 오류 처리기가 클래스 메서드인 경우 이 함수는 클래스 및 메서드 이름과 함께 인덱스 배열을 반환합니다.
변경 로그
버전 | 설명 |
---|---|
8.0.0 | @error-control operator에 의해 표현식이 억제되었을 때 errno 는 더 이상 0 이 아닙니다. |
8.0.0 | errcontext 가 제거되었으며 더 이상 사용자 콜백에 전달되지 않습니다. |
7.2.0 | errcontext 는 더 이상 사용되지 않습니다. 이제 이 매개변수를 사용하면 E_DEPRECATED 알림이 표시됩니다. |
Examples
예제 #1 Error handling with set_error_handler() 및 trigger_error()
아래 예는 오류를 트리거하고 사용자 정의 함수로 처리하여 내부 예외를 처리하는 방법을 보여줍니다.
<?php
// error handler function
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
if (!(error_reporting() & $errno)) {
// This error code is not included in error_reporting, so let it fall
// through to the standard PHP error handler
return false;
}
// $errstr may need to be escaped:
$errstr = htmlspecialchars($errstr);
switch ($errno) {
case E_USER_ERROR:
echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
echo " Fatal error on line $errline in file $errfile";
echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
echo "Aborting...<br />\n";
exit(1);
case E_USER_WARNING:
echo "<b>My WARNING</b> [$errno] $errstr<br />\n";
break;
case E_USER_NOTICE:
echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
break;
default:
echo "Unknown error type: [$errno] $errstr<br />\n";
break;
}
/* Don't execute PHP internal error handler */
return true;
}
// function to test the error handling
function scale_by_log($vect, $scale)
{
if (!is_numeric($scale) || $scale <= 0) {
trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR);
}
if (!is_array($vect)) {
trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING);
return null;
}
$temp = array();
foreach($vect as $pos => $value) {
if (!is_numeric($value)) {
trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE);
$value = 0;
}
$temp[$pos] = log($scale) * $value;
}
return $temp;
}
// set to the user defined error handler
$old_error_handler = set_error_handler("myErrorHandler");
// trigger some errors, first define a mixed array with a non-numeric item
echo "vector a\n";
$a = array(2, 3, "foo", 5.5, 43.3, 21.11);
print_r($a);
// now generate second array
echo "----\nvector b - a notice (b = log(PI) * a)\n";
/* Value at position $pos is not a number, using 0 (zero) */
$b = scale_by_log($a, M_PI);
print_r($b);
// this is trouble, we pass a string instead of an array
echo "----\nvector c - a warning\n";
/* Incorrect input vector, array of values expected */
$c = scale_by_log("not array", 2.3);
var_dump($c); // NULL
// this is a critical error, log of zero or negative number is undefined
echo "----\nvector d - fatal error\n";
/* log(x) for x <= 0 is undefined, you used: scale = $scale" */
$d = scale_by_log($a, -2.5);
var_dump($d); // Never reached
?>
위의 예는 다음과 유사한 결과를 출력합니다.
vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- vector b - a notice (b = log(PI) * a) My NOTICE [1024] Value at position 2 is not a number, using 0 (zero)
Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vector c - a warning My WARNING [512] Incorrect input vector, array of values expected
NULL ---- vector d - fatal error My ERROR [256] log(x) for x <= 0 is undefined, you used: scale = -2.5
Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)
Aborting...
기타
- ErrorException
- error_reporting() - 보고되는 PHP 오류를 설정합니다.
- restore_error_handler() - 이전 오류 처리기 함수를 복원합니다.
- trigger_error() - 사용자 수준 오류/경고/통지 메시지 생성
- error level constants