php基础之错误处理

错误分类

  • 语法错误:程序运行前都会检测语法,如果语法有问题,则不会运行,一般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 = OnOff
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简单的错误处理,简记这些了~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值