如果没有错误处理机制会怎样?
文件没有打开,但仍然向下执行,输出了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)
错误报告级别
2 | E_WARNING | 非致命的 run-time 错误。不暂停脚本执行。 |
---|---|---|
8 | E_NOTICE | run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。 |
256 | E_USER_ERROR | 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。 |
512 | E_USER_WARNING | 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。 |
1024 | E_USER_NOTICE | 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。 |
4096 | E_RECOVERABLE_ERROR | 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler()) |
8191 | E_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';