【PHP基础学习】—PHP错误和异常机制
前言
以前版本的PHP只有错误没有异常。PHP5版本之后,有了异常机制,同时也完善了错误机制。我们可以在官方文档找到所有的错误的定义,这些错误可以大致分为WARNING,ERROR(fatalerror),NOTICE等;至于异常,异常是对程序错误的一种优秀的处理方式,较于错误,异常的优点是默认打印调用栈,便于调试,可控等,对异常的处理也要遵循前述的错误处理规则。本章就来总结一下PHP的错误和异常机制。一、PHP的错误机制
1、PHP的错误级别PHP的错误级别,现在基本划分为15个错误级别:
PHP的错误,可以由php语言解释器本身以及php进程管理器(Nginx用php-fpm)或者管理模块(Apache用Module)来控制,这里以Nginx架构为例,以php+php-fpm的模型来说,会影响php错误显示的其实是有两个配置文件,一个是php本身的配置文件php.ini,另外一个是php-fpm的配置文件,php-fpm.conf。
(1)php.ini中的配置
PHP默认是会在日志和标准输出(如果是fpm模式标准输出就是页面):
a.error_reporting的参数是错误级别。表示什么样子的级别才应该触发错误。我们可以通过调用这个参数来定义需要触发的错误,不需要触发的,不管是日志,还是页面,都不会显示这个错误。
b.display_errors是控制是否要在标准输出展示错误信息,可以设置为ON或者OFF;
c.log_errors则是控制是否要在日志中记录错误信息。
注:另外还有ignore_repeated_errors这个标记控制的是如果有重复的日志,那么就只会记录一条,比如:ini_set('ignore_repeated_errors', 1);
(3)php-fpm中的配置
而php.ini中的error_log是记录php程序本身的错误日志。
error_log是显示错误日志的位置,这个在php-fpm中往往会被重写,于是往往会发现的是cli和fpm的错误日志竟然不是在同一个文件中。
二、PHP的异常机制
在我们的日常开发中,不可能保证可以catch所有的异常,而未被catch的异常将以fatal error的形式中断脚本的执行并输出错误信息。所以要借助 set_exception_handler,统一处理所有未被 catch 的异常。我们可以像error_handler那样,在exception_handler中处理log,将数据库的事务回滚。PHP7的异常机制
PHP 7改变了大多数错误的报告方式。不同于传统PHP5的错误报告机制,现在大多数错误被作为Error异常抛出。
PHP7中是将曾经的fatal error变成了Error抛出,而fatal error一般都是一些不需要在运行时处理的错误,这种错误旨在提醒程序员,这里的代码写的有问题,需要修复,而不是逻辑上要catch它做某些业务。
因此,绝大多数情况下,我们并不需要继承Error,甚至catch Error也不常见,只在某些需要log,回滚数据库,清理现场等场合才需要这样做。
三、总结和实际应用
1、必须用error_reporting让PHP报告错误;2、在开发环境中时要显示错误;
3、在生产环境中不能显示错误;
4、在开发和生产环境中都要记录错误。生产环境最好能够有日志收集系统
四、参考文档
http://www.laruence.com/2010/08/03/1697.htmlhttps://mp.weixin.qq.com/s?__biz=MzUyNDg1Nzg1OA==&mid=2247484928&idx=2&sn=d988c296b6729abb4f5047c60bd5d633&source=41#wechat_redirect