• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php如何处理错误

php如何处理错误

显示错误报告

在实际开发过程中,不可避免的会出现各种各样的错误,为了提高开发效率,php语言提供了显示错误的机制,该机制可以控制是否显示错误以及显示错误的级别等,在php中实现显示错误的机制有两种方式

1.修改配置文件

通过配置文件php.ini文件实现显示错误报告,代码如下

error_reporting(E_ALL & ~E_NOTICE);
display_errors=on;

上述代码中。error_reporting用于设置错误级别,display_errors用于设置是否显示错误报告。“E_ALL & ~E_NOTTICE”表示显示除E_NOTTICE之外所有的级别错误

2.erroe_reporting()和ini_set()函数

通过php语言提供的erroe_reporting()和ini_set()函数来实现显示错误报告,代码格式如下

<?php
    erroe_reporting(E_ALL & ~E_NOTTICE);
    ini_set('display_errors',1);
?>

上述代码中,ini_set()函数用来设计值php.ini中指定选项的值(仅在脚本中生效)error_reporying()函数用于设置错误级别

案例

<?php
    ini_set('display_errors',1);
    $rand_num=mt_rand(0,1);
    echo $rand_num;
    if($rand_num==0){
        error_reporting(E_ALL); //报告所有错误
    }else {
        error_reporting(E_ALL & ~E_NOTICE); //除了E_NOTICE,报告其他所有错误
    }
    echo $info;
?>

运行结果

陵小宇博客显示php错误报告 陵小宇博客显示php错误报告

使用error_reporing()函数控制显示错误以及显示错误级别的功能,通过代码mt_rand()函数产生一个0或1的随机数,如果$rand_num的值为0,则显示所有错误,如果值为1,则显示除E_NOTICE以外的错误。变量$info未定义,会触发E_NOTICE错误,因此,当随机数位0时,会显示变量未定义的错误,当随机数为1时,不会显示错误

3.die()函数

die()函数可以用来自定义输出错误信息,常用于业务逻辑的错误显示。

案例

<?php
    header('Content-Type:text/html;charset=utf-8');
    $result=defined('PAI');
    if(!$result){
        die("PAI常量不存在");
    }
?>

运行结果

陵小宇博客显示php错误报告

通过defined()函数实现对常量PAI是否存在进行判断,如果不存在则调用die()函数进行处理,其中die()函数用于输出一条消息,并退出当前脚本,是exiet()函数的别名,需要注意的是,使用函数控制的方式只对当前脚本有效,而配置文件php.ini对所有脚本都有效

die()函数与or运算符配合使用

上述案例,还有另外一种写法可以自定义输出错误信息,那就是通过逻辑运算符的短路特性,代码如下

<?php
    $result=defined('PAI') or die("PAI常量不存在");
?>

上述代码中,由于“=”运算符的优先级高于“or”运算符,所以先对defined('PAI')进行运算,如果判断为真,or后的语句就不执行,如果为假,就执行die()函数

记录错误日志

网站已经上线或者正在运行,错误显示就会影响用户体验,这时就需要将这些错误记录下来,为后期解决这些错误提供帮助。

在php语言中可以通过配置文件来记录错误日志信息,还可以通过error_log()函数来记录错误日志信息

1.修改配置文件

通过修改php.ini配置文件,可以直接设置记录错误日志文件的相关信息,具体代码如下:

error_reporting=E_ALL
log_error=on
error_log=/tmp/php_errors.log

上述代码中,errr_reporting用于设置显示错误级别,E_ALL表示显示所有错误,log_reeor由于设置是否记录日志,error_log用于指定写入日志的文件路径

2.error_log()函数

error_log()函数用于将错误记录到指定的日志文件中或发送电子邮件到指定地址,其函数声明如下:

bool error_log(string $message [,int $message_type=0 [,string $destination [,string $extra_headers]]])

上述声明中,$message表示记录的错误信息,参数$message_type表示消息类型,该参数只有两个值,0或1,0表示发送到服务器地址,1表示使用mail()函数发送到指定邮箱地址。$destination表示错误日志记录的位置。$extra_headers表示额外的头,当$message_type=1时才会使用

案例

<?php
    $a=5;
    if($a<10){
        error_log("$a小于10",0); //将错误信息发送到服务器日志或文件(在默认情况下错误会激励到服务器错误日志文件中,如果开启了error_log=sylog配置,则会记录到当前操作系统的日志内)
        echo "here";
    }
    if($a==10){
        error_log("$a等于10",1,"admin@qq.com");//将错误信息通过php的mail()函数发送到指定邮箱地址(但默认情况下不能发送成功,需要配置邮件服务器信息)
    }
    if($a>10){
        error_log("$a大于10",3,"D:/error.log"); //将错误信息保存到D盘下的error.log文件
    }
?>

注意

(1)error_log有两个特殊值,如果没有设置,则默认使用服务器的多五日志来记录错误信息,如果设置为sylog,则将错误信息记录到当前系统的日志内,需要使用事件查看器来查看。

(2)如果删除了服务器的错误日志error.log文件,则需要重启服务器让重新生成error.log

自定义错误处理器

可以通过php.inn配置文件进行修改,实现显示和记录错误信息,但在该文件中无法指定这些错误记录的显示格式,不能很好地定位错误。为此php提供了自定义错误处理器,自定义错误处理器是通过set_error_handler()函数来实现的,其函数声明如下

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

上述声明中,callable表示才参数$error_handler为回调函数类型,$error_handler是必须定义的参数,表示发生错误时运行的函数。$error_types用于指定错误类型

其中,error_handler参数必须符合错误处理器函数的原型,原型如下:

function handler(int $errno, srting $errstr [, int $errfile [,int $errline [, array $errcontext]]]);

上述代码中, $errno表示错误级别。$errstr表示错误说明。 $errfile表示发生错误代码文件名称。$errline表示错误发生的代码行号。$errcontext表示在出发错误的范围内存在的所有变量的数组。其中前两个参数必填。

案例

<?php
    //定义一个处理错误函数
    function customEoor($errno,$errstr){
        echo "<b>Error:</b> [$errno] $errstr";
    }
    //调用自定义错误处理程序
    set_error_handler("customEoor");
    echo($student); //输出一个未定义变量
?>

运行结果

陵小宇博客显示php错误报告

通过set_error_handler()函数实现了自定义错误处理器功能。其中,自定义回调函数customError()实现对错误信息进行输出。需要注意的是,在使用自定义错误处理器后,系统默认错误处理器,就会失效,不能显示和记录错误了。如果在定义的错误处理器函数中返回false,则会在自定义处理函数处理完后交由系统默认错误处理器来处理