php错误处理

本文介绍了PHP错误处理的重要性,详细讲解了如何添加错误处理机制,包括使用PHP默认处理方式、自定义错误处理器以及错误触发器。同时,还讨论了错误日志的记录方法,强调了自定义错误处理在处理逻辑错误中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果没有错误处理机制会怎样?

文件没有打开,但仍然向下执行,输出了ok

<?php
$file = fopen('./aaa.php','r');
echo 'ok';

/*
输出结果;
Warning: fopen(./aaa.txt): failed to open stream: No such file or directory in F:\wamp\www\test.php on line 2
ok
*/

添加错误处理机制

使用file_exists()函数检查文件或文件夹是否存在,返回值为bool

//添加了错误处理机制
if (!file_exists('./aaa.txt')){
    echo '文件不存在,打开失败';
    exit();
}else{
    $file = fopen('./aaa.txt','r');
    echo '文件打开成功';
    fclose($file);
}

方式一:使用php默认处理方式

php会根据默认的逻辑来判断错误等级,决定程序是否继续执行,并输出错误信息

//die() 函数输出一条消息,并退出当前脚本
if (!file_exists('./aaa.txt')){
    die('文件不存在,打开失败');
}else{
    $file = fopen('./aaa.txt','r');
    echo '文件打开成功';
    fclose($file);
}

//更高明的写法
file_exists('aaa.txt') or die('文件不存在,打开失败');
echo '文件打开成功';

方式二:自定义错误处理器(处理系统错误)

如果没有错误处理机制,php就会启动默认处理错误的函数,我们也可以自定义错误处理函数

自定义错误处理器

我们可以创建一个自定义错误处理函数,可以在 PHP 中发生错误时调用该函数。
该函数必须有能力处理至少两个参数 (error level 和 error message),但是可以接受最多五个参数(可选的:file, line-number 和 error context)

// error_level	必需。为用户定义的错误规定错误报告级别
// error_message	必需。为用户定义的错误规定错误消息
error_function(error_level,error_message)

错误报告级别

2E_WARNING非致命的 run-time 错误。不暂停脚本执行。
8E_NOTICErun-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256E_USER_ERROR致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512E_USER_WARNING非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024E_USER_NOTICE用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096E_RECOVERABLE_ERROR可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191E_ALL所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)

默认错误处理示例

$file = fopen('./aaa.txt','r');
echo '<br>'.'ok';
/*
Warning: fopen(./aaa.txt): failed to open stream: No such file or directory in F:\wamp\www\test1.php on line 2
ok*/

自定义错误处理示例

//错误处理函数
function my_error($errno, $errmes){
    echo "<b>$errno</b><br>";
    echo '错误信息:'.$errmes;
}

//设置错误处理函数 (这里是一个回调函数,会改变系统默认的处理函数)

//仅对WARNING级别的错误自定义,这里的错误级别一般用带 不带USER 的
//set_error_handler("my_error",E_WARNING);
//对所有级别的错误自定义
set_error_handler("my_error");


//触发错误
$file = fopen('./aaa.txt','r');
echo '<br>'.'ok';


/*2
错误信息:fopen(./aaa.txt): failed to open stream: No such file or directory
ok*/

方式三:错误触发器(处理逻辑错误)

方式二中,错误级别都是由内建的错误处理程序认定,使用错误触发器可以人为认定哪些是错误及设置其错误级别

需求,当年龄大于120时,我就认定这是一个错误,工资大于10000时,我也认为这是错误… ,对于程序本身没错,但我认为就是错的

人为触发错误

//人为触发错误
$age=500;
if ($age>120){
    //人为触发错误,使用默认错误级别
    trigger_error('年龄过大');
    //人为触发错误,并自定义错误级别,人为触发错误的错误级别一般用带 USER 的
    //trigger_error('年龄过大',E_USER_NOTICE);
    exit();
}

//Notice: 年龄过大 in F:\wamp\www\test3.php on line 18

人为触发错误,并自定义错误处理器

//错误处理函数
function my_error($errno,$errstr){
    echo "<b>$errno</b><br>";
    echo '错误信息:'.$errstr;
    exit();
};

//设置错误处理器
//set_error_handler('my_error');
//仅对NOTICE级别的错误自定义,人为触发错误的错误级别一般用带 USER 的
set_error_handler('my_error',E_USER_ERROR);

//触发错误
$age=500;
if ($age>120){
    //人为触发错误,使用默认错误级别
    //trigger_error('年龄过大');
    //人为触发错误,并自定义错误级别,人为触发错误的错误级别一般用带 USER 的
    trigger_error('年龄过大',E_USER_ERROR);
}
echo 'ok';


/*
256
错误信息:年龄过大*/

错误日志

使用 error_log() 函数,您可以向指定的文件或远程目的地发送错误记录

//错误处理函数
function my_error($errno,$errstr){
    //错误信息和错误时间
    $errinfo = "错误号:".$errno." -- "."$errstr";
    date_default_timezone_set('PRC');
    $error_time =  date("Y-m-d H:i:s");
    echo $errinfo.$error_time;
    
    //添加错误日志  3表示追加
    //\r\n :表示向文件输入一个回车换行
    //<br> :表示次向网页输出一个回车换行
    error_log($errinfo.'   '.$error_time."\r\n",3,'myerr.txt');

    exit();
};

//设置错误处理器
set_error_handler('my_error',E_USER_ERROR);

//触发错误
$age=500;
if ($age>120){
    trigger_error('年龄过大',E_USER_ERROR);
}
echo 'ok';
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值