PHP错误处理 - set_error_handler()的用法

定义和用法

set_error_handler 设定用户自定义的错误处理函数. 方便用户自己定义来处理运行中的错误.

语法

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

参数

参数      描述
error_handler必须。规定发生错误时运行的函数
error_types可选。规定在哪个错误报告级别会显示用户定义的错误。默认是 "E_ALL"。

 

 

 

 

 

 

error_handler

以下格式的回调(callback): 可以传入 null 重置处理程序到默认状态。 除了可以传入函数名,还可以传入引用对象和对象方法名的数组。

handler ( int $errsn , string $errstr [, string $errfile [, int $errline [, array$errcontext]]] ) : bool

参数描述
errno必须。错误级别,是一个integer
errstr必须。错误信息,是一个string
errfile可选。错误的文件名,是一个string
errline可选。错误的行号, 是一个integer

 

 

 

 

 

 

 

errcontext 在php7.2.0以后被弃用。

 

重点1: error_types里指定的错误类型都会绕过php标准错误处理程序, 除非回调函数返回了FALSE.

例子1: error_type 默认的是E_ALL, 因为没有定义$a, 所以报Notic错误, 绕过了PHP标准错误处理程序,调用回调函数。

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    case E_ERROR:
        echo "<b>My ERROR</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}

 输出:

My NOTICE</b> [8] Undefined variable: a

例子2:  利用error_reporting()函数 和 $errno 进行位与运算返回FALSE 或者在匹配的E_NOTICE中 return FALSE 就会走PHP标准错误处理程序.

<?php

function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if ((error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
     //return FALSE; 
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}

输出:

PHP Notice:  Undefined variable: a in /root/testerror1.php on line 22

 

重点2: error_reporting()设置将不会起到作用而你的错误处理函数继续会被调用, 不过仍然可以获取error_reporting的当前值,并做处理.

例子: 设置error_reporting 为E_ERROR | E_WARNING | E_PARSE 去除E_NOTICE ,但是错误处理函数继续被调用

<?php

error_reporting
(E_ERROR | E_WARNING | E_PARSE); function myErrorHandler($errno, $errstr, $errfile, $errline) { //if (!(error_reporting() & $errno)) { // return false; //} switch ($errno) { case E_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } return true; } $error_handler = set_error_handler("myErrorHandler"); if($a == 1) { echo 'test error'; }

输出:

<b>My NOTICE</b> [8] Undefined variable: a<br />

 

重点3: 错误处理函数报错后,程序依然进行,有需要的时候使用die()

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    //die()
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

$error_handler = set_error_handler("myErrorHandler");

if($a == 1) {
        echo 'test error';
}
echo "hello";

输出:

<b>My NOTICE</b> [8] Undefined variable: a<br />
hello

 

重点4: 如果错误发生在执行脚本之前, 将不会调用自定义的错误处理程序, 因为它尚未被注册.

<?php
function myErrorHandler($errno, $errstr, $errfile, $errline)
{
    if (!(error_reporting() & $errno)) {
        return false;
    }
    switch ($errno) {
    case E_NOTICE:
        echo "<b>My NOTICE</b> [$errno] $errstr<br />\n";
        break;
    default:
        echo "Unknown error type: [$errno] $errstr<br />\n";
        break;
    }

    return true;
}

if($a == 1) {
        echo 'test error';
}
$error_handler = set_error_handler("myErrorHandler");
echo "hello";

输出:

PHP Notice:  Undefined variable: a in /root/testerror1.php on line 19
hello

 

重点5:error_handler 除了可以传函数名,还可以传数组或者对象

<?php

class errorHandler{
        public function myErrorHandler($errno, $errstr, $errfile, $errline) {
                if (!(error_reporting() & $errno)) {
                        return false;
                }
                switch($errno) {
                        case E_NOTICE:
                                echo "<b> My NOTICE</b> [$errno] $errstr <br />";
                                break;
                          default:
                                echo "Unknown error type: [$errno] $errstr<br />\n";
                                break;
                }
                return true;
        }
}
$error_handler = set_error_handler(array('errorHandler', 'myErrorHandler'));
if ( $a == 1) {
        echo "test error";
}

 

输出:

My NOTICE [8] Undefined variable: a 

 

转载于:https://www.cnblogs.com/arnoldlivip/p/10458118.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值