본문 바로가기

Code Snippets/php

set_error_handler

set_error_handler

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

set_error_handler — 사용자 정의 오류 장치 함수를 설정한다

설명

mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )

스크립트 오류 처리 사용자 함수 (error_handler)을 설정합니다.

이 함수는 실행 시 에러 처리를 사용자가 정의하기 위해서 사용합니다. 예를 들면 치명적인 에러 때 데이터나 파일을 삭제할 필요가 있는 어플리케이션이나, 어떤 조건 아래 (trigger_error()를 사용하여)오류를 발생할 필요가 있다 애플리케이션이 이 경우에 해당합니다.

콜백 함수를FALSE 돌려보내지 않는 한error_types 에서 지정된 형태의 에러에서는 PHP표준 오류 장치가 완전히 우회되는 것에 주의하세요. error_reporting() 설정에 관계 없이, 어떤 경우에도 사용자가 설정한 에러 핸들러가 호출됩니다. 다만 이 경우에도 핸들러에서error_reporting() 전류의 값을 읽고 그것에 맞추어 적절하게 작동시킬 수 있습니다. 오류를 발생한 명령 앞에 @오류 제어 연산자 이 부가된 경우 이 값은 0이 되는 것에는 주의합시다.

사용자 장치 함수는 필요 시die() 를 부르는 책임이 있음에도 주의합시다. 오류 장치 함수가 리턴 할 경우 스크립트의 실행은 오류를 발생한 명령 다음 명령에 계속됩니다.

아래의 에러 타입은 사용자 정의 함수에서는 다루지 못 합니다. E_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERROR,E_COMPILE_WARNING 및 set_error_handler() 가 호출된 파일에서 발생한 대부분의E_STRICT .

(파일 업로드처럼)스크립트가 실행되기 전에 에러가 발생한 경우, 커스텀 에러 핸들러는 호출되지 않습니다. 이는 그 시점에서는 등록되지 않기 때문입니다.

파라미터

error_handler

다음 서명에 따라콜백. NULL 을 주면 장치를 기본 상태로 되돌릴 수 있습니다. 함수 이름 대신에 객체에 대한 레퍼런스와 메소드 이름을 포함한 배열을 지정할 수도 있습니다.

bool handler ( int $errno , string $errstr [, string $errfile [, int $errline [, array $errcontext ]]] )
errno
처음의 파라미터errno 는 발생시키는 오류 수준을 정수로 격납합니다.
errstr
2번째의 파라미터는errstr , 에러 메시지를 문자열로 저장합니다.
errfile
3번째의 파라미터는errfile 옵션으로 에러가 발생한 파일의 이름을 문자열로 저장합니다.
errline
4번째의 파라미터는errline 옵션으로 에러가 발생한 행 번호를 정수로 격납합니다.
errcontext
5번째의 파라미터는errcontext 옵션으로 에러가 발생한 곳의 액티브 상징 테이블을 가리키는 배열입니다. 즉, 에러가 발생한 영역 내에서 모든 변수의 내용을 격납했다 배열이errcontext 라는 것입니다. 사용자 오류 장치는 결코 오류 콘텍스트를 다시 쓰고는 안 됩니다.

이 함수를FALSE 돌렸을 경우 통상의 에러 핸들러가 처리를 계승하는요.

error_types

설정 파라미터 error_reporting 로 표시하는 에러를 제어하는 것과 똑같이, error_handler 구동을 제어할 때 사용 가능합니다. 이 마스크를 지정하지 않는 경우 error_handler 는 error_reporting 설정에 관계 없이 모든 오류에 관해서 호출됩니다.

반환 값

전에 정의된 에러 핸들러(어느 경우)를 포함한 문자열을 갚겠습니다. 조립 오류 장치를 사용하고 있는 경우는NULL 을 갚겠습니다. 또 무효인 콜백 등에서 에러가 된 경우도NULL 갚겠습니다. 전에 정의된 핸들러가 반 메소드의 경우 이 함수는 클래스와 메소드 이름으로 구성된 첨자 배열을 갚겠습니다.

변경 이력

버전설명
5.5.0error_handler 를NULL 드리게 되었습니다.
5.2.0$php_errormsg 내용을 설정하기 때문에, 에러 핸들러는 반드시FALSE 갚아야 합니다.

사례 1 set_error_handler() 및 trigger_error() 에 의한 에러 처리

다음 예에서는 오류를 발생시킴으로써 내부 예외의 처리나 그것들을 사용자 정의 함수로 처리하는 방법을 설명합니다.

<?php
// 에러 핸들러 함수
function myErrorHandler($errno$errstr$errfile$errline)
{
    if (!(
error_reporting() & $errno)) {
        
// error_reporting 설정에 포함되지 않은 오류 코드입니다
        
return;
    }

    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);
        break;

    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;
    }

    
/* PHP&nbsp의 내부 에러 핸들러를 실행하지 않습니다 */
    
return true;
}

// 에러 처리 시험용 함수
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;
}

// 정의한 장애 장치를 설정하다
$old_error_handler set_error_handler("myErrorHandler");

// 오류를 발생합니다. 우선 수치가 없는 항목이 섞인 배열을 정의합니다.
echo "vector a\n";
$a = array(23"foo"5.543.321.11);
print_r($a);

// 두번째 배열을 생성합니다.
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($aM_PI);
print_r($b);

// 배열 대신 문자열을 주며 문제를 발생합니다.
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

// 제로 또는 음수 로그가 정의되지 않는다는 치명적인 오류를 발생합니다.
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); // 여기에는 도달하지 않습니다
?>

위의 예의 출력은 예를 들면 이하와 같이 됩니다.

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)
<b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br />
Array
(
    [0] => 2.2894597716988
    [1] => 3.4341896575482
    [2] => 0
    [3] => 6.2960143721717
    [4] => 49.566804057279
    [5] => 24.165247890281
)
----
vector c - a warning
<b>My WARNING</b> [512] Incorrect input vector, array of values expected<br />
NULL
----
vector d - fatal error
<b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br />
  Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)<br />
Aborting...<br />


'Code Snippets > php' 카테고리의 다른 글

함수 : ucfirst / lcfirst  (0) 2015.12.08
함수 : get_class()  (0) 2015.12.07
함수:unset()  (0) 2014.09.03
함수 : die()  (0) 2014.08.26
함수 : str_replace  (0) 2014.08.25