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_STRICTset_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...

기타