set_error_handler
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
set_error_handler — 사용자 정의 오류 장치 함수를 설정한다
설명
스크립트 오류 처리 사용자 함수 (error_handler)을 설정합니다.
이 함수는 실행 시 에러 처리를 사용자가 정의하기 위해서 사용합니다. 예를 들면 치명적인 에러 때 데이터나 파일을 삭제할 필요가 있는 어플리케이션이나, 어떤 조건 아래 (trigger_error()를 사용하여)오류를 발생할 필요가 있다 애플리케이션이 이 경우에 해당합니다.
콜백 함수를FALSE 돌려보내지 않는 한error_types 에서 지정된 형태의 에러에서는 PHP표준 오류 장치가 완전히 우회되는 것에 주의하세요. error_reporting() 설정에 관계 없이, 어떤 경우에도 사용자가 설정한 에러 핸들러가 호출됩니다. 다만 이 경우에도 핸들러에서error_reporting() 전류의 값을 읽고 그것에 맞추어 적절하게 작동시킬 수 있습니다. 오류를 발생한 명령 앞에 @오류 제어 연산자 이 부가된 경우 이 값은 0이 되는 것에는 주의합시다.
사용자 장치 함수는 필요 시die() 를 부르는 책임이 있음에도 주의합시다. 오류 장치 함수가 리턴 할 경우 스크립트의 실행은 오류를 발생한 명령 다음 명령에 계속됩니다.
아래의 에러 타입은 사용자 정의 함수에서는 다루지 못 합니다. E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_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.0 | error_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 의 내부 에러 핸들러를 실행하지 않습니다 */
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(2, 3, "foo", 5.5, 43.3, 21.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($a, M_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 |