您的位置:首页 > 编程语言 > PHP开发

php基础之错误处理

2016-09-20 11:37 183 查看

错误分类

语法错误:程序运行前都会检测语法,如果语法有问题,则不会运行,一般IDE会帮我们check了。

运行时错误:程序语法检测通过,在运行期间发生的错误,一般分为三种->提示性错误 警告性错误 致命错误

逻辑错误:程序本身可以正常执行,但输出结果和预期不符。

错误分级

php中,将各种错误进行了不同级别的划分,大约有十多个级别,这就是技术层面的错误分级。

每个级别的错误都有相应代号,就是系统内部定义的一个常量。

常见的错误级别有如下几种:

echo "<pre>";
// 系统常见错误
echo "<br> E_ERROR = " . E_ERROR . ",\t\t其对于的二进制值为:" . getBinStr(E_ERROR);
echo "<br> E_WARNING = " . E_WARNING . ",\t\t其对于的二进制值为:" . getBinStr(E_WARNING);
echo "<br> E_NOTICE = " . E_NOTICE . ",\t\t其对于的二进制值为:" . getBinStr(E_NOTICE);
echo E_NOTICE;
// 用户自定义错误
echo "<br> E_USER_ERROR = " . E_USER_ERROR . ",\t其对于的二进制值为:" . getBinStr(E_USER_ERROR);
echo "<br> E_USER_WARNING = " . E_USER_WARNING . ",\t其对于的二进制值为:" . getBinStr(E_USER_WARNING);
echo "<br> E_USER_NOTICE = " . E_USER_NOTICE . ",\t其对于的二进制值为:" . getBinStr(E_USER_NOTICE);
// 其他
echo "<br> E_STRICT = " . E_STRICT . ",\t其对于的二进制值为:" . getBinStr(E_STRICT);
echo "<br> E_ALL = " . E_ALL . ",\t\t其对于的二进制值为:" . getBinStr(E_ALL);
echo "</pre>";

function getBinStr($e)
{
$s = decbin($e);
$s1 = str_pad($s, 16, "0", STR_PAD_LEFT);
return $s1;
}


输出结果为:

E_ERROR = 1,       其对于的二进制值为:0000000000000001
E_WARNING = 2,     其对于的二进制值为:0000000000000010
E_NOTICE = 8,      其对于的二进制值为:00000000000010008
E_USER_ERROR = 256,    其对于的二进制值为:0000000100000000
E_USER_WARNING = 512,  其对于的二进制值为:0000001000000000
E_USER_NOTICE = 1024,  其对于的二进制值为:0000010000000000
E_STRICT = 2048,   其对于的二进制值为:0000100000000000
E_ALL = 32767,     其对于的二进制值为:0111111111111111


错误的触发

系统触发

程序运行中,确实出现了某种错误,此时系统就会报错。常见的有以下三种:

E_NOTICE

提示性错误,会输出错误提示,并继续执行后面的代码

echo $a;


Notice: Undefined variable: a in D:\PhpstormProjects\study\day05\php_error_record.php on line 31


比如使用了未定义的变量。

E_WARNING

警告性错误:会输出错误提示,并继续执行后续代码(也可能看具体情况,比如require),比如引用了不存在的文件

include ".test.php";


Warning: include(.test.php): failed to open stream: No such file or directory in D:\PhpstormProjects\study\day05\php_error_record.php on line 37

E_ERROR

致命错误,导致程序无法执行后续语句,比如调用一个不存在的函数

unDefinedFuntion();


Fatal error: Call to undefined function unDefinedFuntion() in D:\PhpstormProjects\study\day05\php_error_record.php on line 37

自定义触发

当我们在处理某些数据时,数据本身没有问题,可能和我们当前的场景业务来说是不满足的,这时候,就需要我们自己去主动触发一个错误,来表示数据的非法性。

示例如下:

//trigger_error("错误提示内容",3种用户错误代号之一);
//如果出发了E_USER_ERROR,也会终止后面代码的执行
trigger_error("主动触发错误",E_USER_NOTICE);


( ! ) Notice: 主动触发错误 in D:\PhpstormProjects\study\day05\php_error_record.php on line 35
Call Stack
#   Time    Memory  Function    Location
1   0.0020  143856  {main}( )   ..\php_error_record.php:0
2   0.0111  144280  trigger_error ( )   ..\php_error_record.php:35


错误日志的显示问题

是否显示错误日志

方式一:

在php.ini文件中,修改是否显示错误日志的值,如下:

; Default Value: On// 默认
; Development Value: On//开发环境
; Production Value: Off//生产环节
; http://php.net/display-errors display_errors = On


在此文件中修改后,需要重启才能生效。

ps:需要在apache中装载了php.ini文件,在apache的配置httpd.config中加入如下配置:

PHPIniDir  “php.ini文件所在的目录”


方式二

直接在php脚本文件中修改,如:

ini_set("display_errors", 1);// 0 or false 关闭   1 or true 打开


使用php.ini配置,作用的是全局。

php脚本中通过ini_set()设置,作用的是当前文件

脚本中的设置优先于php.ini中的设置

自定义显示错误日志级别

前提是需要打开错误日志的输出。display_errors为1或true

方式一

在php.ini文件中进行修改,关键词为error_reporting

; Default Value: E_ALL & ~E_NOTICE
; Development Value: E_ALL | E_STRICT
; Production Value: E_ALL & ~E_DEPRECATED
; http://php.net/error-reporting error_reporting = E_ALL


方式二

在php脚本中修改,如:

ini_set("error_reporting", E_ALL | E_STRICT);


ps:E_ALL | E_STRICT才是代表显示所有错误。

错误日志的记录

将错误信息保存到文件中,方便查阅

是否开启日志记录

php.ini中:log_errors = On    或 Off
php脚本中:ini_set("log_errors",1);


保存日志

方式一

// 提供一个文件名,系统会自动在当前目录下建对应的文件,并把错误信息写入该文件
ini_set("error_log", "my_error.txt");


方式二

//使用一个特殊的名字,如果发生错误,则会记录在系统的日志文件中。
//控制面板->管理工具->事件查看器->window日志->应用程序
ini_set("error_log", "syslog");


自定义错误处理器

当发生错误时,由开发者对错误进行处理,而不是交由系统处理,其实就是定义一个函数。

A. 设置要处理错误的函数名

set_error_handler("onErrorHandler");


B. 定义该函数,实现自己的错误处理

/**
* @param $errCode 错误代号
* @param $errMsg   错误信息
* @param $errFile  错误所在的文件
* @param $errLine  错误错在的行
*/
function onErrorHandler($errCode, $errMsg, $errFile, $errLine)
{
// do something
}


好了,php简单的错误处理,简记这些了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息