PHP的错误处理
PHP的错误处理机制
php的错误处理是比较复杂的, 本文讲解php中所有错误相关的重要知识点做一次梳理, 便于理解php的错误机制.
基础知识
在此之前, 先熟悉一下php手册中 error的基础知识
预定义常量
定义了所有php的错误类型常量, 每一个常量都是一个整型数值, 它的作用在于
常量值(数值或者符号)用于建立一个二进制位掩码,来制定要报告的错误信息。可以使用按位运算符来组合这些值或者屏蔽某些类型的错误。请注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 会正确解析。
从使用的角度看, 可以分为三类:
- 用户手动抛出的
E_USER_NOTICE,E_USER_WARNING,E_USER_ERROR,E_USER_DEPRECATED - 用户造成的
E_NOTICE,E_PARSE,E_WARNING,E_ERROR,E_COMPILE_ERROR,E_COMPILE_WARNING,E_STRICT,E_RECOVERABLE_ERROR - php内核造成的
E_CORE_ERROR,E_CORE_WARNING
从是否终止程序执行的角度看, 可分为两类
终止程序执行
程序终止, 进入处理错误流程。不终止程序执行
产生错误, 但程序仍可以继续执行, 同样会进入错误处理流程;即发生错误,进入处理流程,再继续执行。
对于PHP中的错误类型, 可以参考这篇更详细的文章--PHP的错误机制总结
运行时配置
手册--运行时配置讲解的很详细, 但有几个配置仍需特别注意
error_reporting
报告错误的类型, 建议在开发/测试环境配置成E_ALL, 解决所有的类型的错误后, 在生产环境配置E_ALL & E_DEPRECATED, 则表明:报告除废弃错误外的所有错误display_errors
是否显示错误, 在生产环境中配置成false, 配合上面error_reporting的设置, 则表明: 报告除废弃错误外的所有错误, 但不显示错误信息(即用户看不到).log_errors
错误记录是否开启, 生产环境需开启. 配合上面的两项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录(只有php自己可以操作错误信息)到日志中.error_log
指定错误的文件(syslog是特殊值).默认未被设置, 手册中:
如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器
一般情况下, 未设置会被记录到apache/nginx的错误日志中. 配合上面三项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到apache/nginx日志中.若配置了文件路径, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录到file_dir日志中.
上面这几项配置影响着php错误最基本的表现.当然,这些配置可以通过 ini_set() 在代码中更改 或 php-fpm配置更改
错误处理函数
错误函数并不多, 最应该关注的就是set_error_handler 和 set_exception_handler , 因为通过它们可以介入错误/异常的处理流程.
上面提到过, 错误发生后, 都会进行错误处理流程, 那错误流程如何定义?
先看看php手册中的讲解: Errors
简单来说就是, 默认的处理流程就是通过配置完成, 但我们可以设置自定义的错误处理流程
终止脚本执行的错误如何处理
上文提到过, 错误有两种, 那对于这种会终止脚本执行的错误如何处理?
set_error_handler不能处理这种错误, 这一点很容易被忽略. 所以要寻找另一种方法.
这个问题基本上是这样完成的(还未见过其他方案):
// 终止脚本的错误会终止脚本执行
// 即会调用已通过register_shutdown_function注册的处理函数
// 由此可注册我们的错误处理流程, 这样就进入了自定义错误流程
register_shutdown_function('fatalErrorHandle');
...
function fatalErrorHandle(array $error = null) {
...
if (null === $error) {
// 通过这种方式可以获取最后一条错误
$error = error_get_last();
}
...
// log or other logic
}
异常
根据w3cPHP 异常处理中的讲解:
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。这种情况称为异常。
当异常被触发时,通常会发生:
- 当前代码状态被保存
- 代码执行被切换到预定义的异常处理器函数
- 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中外的位置继续执行脚本
未被catch的异常会终止脚本执行并产生一个E-ERROR错误, 执行定义的异常处理, 若无则进行php默认的错误处理流程, 即记录到日志中. 但在编程概念上应该将异常与错误分开, 异常对于用户而言是可预见的, 不符合预期的, 可控制的结构.
上文提到的set_exception_handler就是处理异常的, 用法与set_error_handler一致. 在各框架中的异常处理很成熟, 大致都是在set_exception_handler中将Exception转移到框架可处理级别, 框架同时会开放良好的接口供用户使用, 从而达到用户控制异常处理的目的, 实现定制和扩展.
总结
php的错误处理机制总是被忽略, 但它对调试, 监控错误有很大的作用. 本文主要介绍了其中的主要知识点, 并做了一个梳理, 希望对大家有用.更多的细节还请查看手册.
学习资料
预定义常量
运行时配置
错误处理函数
PHP的错误机制总结
异常
Errors
PHP 异常处理
Symfony Debug:是一个完整的应用, 可以说是一个全面的指导教程, 所有与error相关的知识点都涉及到了. 建议阅读源代码.
PHP的错误处理的更多相关文章
- 航空概论(历年资料,引之百度文库,PS:未调格式,有点乱)
航空航天尔雅 选择题1. 已经实现了<天方夜谭>中的飞毯设想.—— A——美国2. 地球到月球大约—— C 38 万公里3. 建立了航空史上第一条定期空中路线—— B——德国4. 对于孔明 ...
- 日期格式代码出现两次的错误 ORA-01810
错误的原因是使用了两次MM . 一.Oracle中使用to_date()时格式化日期需要注意格式码 如:select to_date('2005-01-01 11:11:21','yyyy-MM-dd ...
- ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”
DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...
- 实时的.NET程序错误监控产品Exceptionless
Exceptionless可以对ASP.NET, Web API, WebForms, WPF, Console, 和 MVC 应用提供错误监控.上传.报表服务.使用时需要在Exceptionless ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- SQL Server 致程序员(容易忽略的错误)
标签:SQL SERVER/MSSQL/DBA/T-SQL好习惯/数据库/需要注意的地方/程序员/容易犯的错误/遇到的问题 概述 因为每天需要审核程序员发布的SQL语句,所以收集了一些程序员的一些常见 ...
- C# - 值类型、引用类型&走出误区,容易错误的说法
1. 值类型与引用类型小总结 1)对于引用类型的表达式(如一个变量),它的值是一个引用,而非对象. 2)引用就像URL,是允许你访问真实信息的一小片数据. 3)对于值类型的表达式,它的值是实际的数据. ...
- 记一个mvn奇怪错误: Archive for required library: 'D:/mvn/repos/junit/junit/3.8.1/junit-3.8.1.jar' in project 'xxx' cannot be read or is not a valid ZIP file
我的maven 项目有一个红色感叹号, 而且Problems 存在 errors : Description Resource Path Location Type Archive for requi ...
- 【WCF】错误协定声明
在上一篇烂文中,老周给大伙伴们介绍了 IErrorHandler 接口的使用,今天,老周补充一个错误处理的知识点——错误协定. 错误协定与IErrorHandler接口不同,大伙伴们应该记得,上回我们 ...
随机推荐
- 一次dns缓存引发的惨案
时间2015年的某个周六凌晨5点,公司官方的QQ群有用户反馈官网打不开了,但有的用户反馈可以打开,客服爬起来自己用电脑试了一下没有问题,就给客户反馈说,可能是自己网络的问题,请过会在试试.早点8点,越 ...
- Yii框架上传后展示图片
在视图层index.php展示代码中加入[ 'attribute' => 'file', 'format' => 'raw', 'value' => function($model) ...
- cmake的四个命令:add_compile_options、add_definitions、target_compile_definitions、build_command
cmake的四个命令:add_compile_options.add_definitions.target_compile_definitions.build_command add_compile_ ...
- 移动HTML5前端性能优化总结
概述 1. PC优化手段在Mobile侧同样适用 2. 在Mobile侧我们提出三秒种渲染完成首屏指标 3. 基于第二点,首屏加载3秒完成或使用Loading 4. 基于联通3G网络平均338KB/s ...
- 矢量切片(Vector tile)番外一:Proj4js
说明:番外篇是对正篇矢量切片(Vector tile)中提到的一些值得继续延伸的关注点继续进行探索和学习,所涉及的内容以解决实际问题为主要导向. 一.新的需求? 在完成了矢量切片的工作后,新的需求出现 ...
- 理解zookeeper选举机制
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- [Netty] - Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...
- [Android] "Failed to find Java version for 'C:\Windows\system32\java.exe"
Impossible to install SDK r17 on win 7 x64 "Failed to find Java version for 'C:\Windows\system3 ...
- android学习19--Matrix.mapPoints作用
android图形的旋转,缩放,平移都是用matrix实现的.可以用mapPoints来计算一个点旋转,缩放,平移后的坐标.看下面例子. Matrix matrix = new Matrix(); m ...
- Dijkstra算法的二叉堆优化
Dijkstra算法的二叉堆优化 算法原理 每次扩展一个距离最小的点,再更新与其相邻的点的距离. 如何寻找距离最小的点 普通的Dijkstra算法的思路是直接For i: 1 to n 优化方案是建一 ...