PHP的错误处理机制

php的错误处理是比较复杂的, 本文讲解php中所有错误相关的重要知识点做一次梳理, 便于理解php的错误机制.

基础知识

在此之前, 先熟悉一下php error的基础知识

  • 预定义常量
  • 运行时配置
  • 异常
  • 错误处理函数

预定义常量

定义了所有php的错误类型常量, 每一个常量都是一个整型数值, 它的作用在于

上面的值(数值或者符号)用于建立一个二进制位掩码,来制定要报告的错误信息。可以使用按位运算符来组合这些值或者屏蔽某些类型的错误。请注意,在 php.ini 之中,只有'|', '~', '!', '^' 和 '&' 会正确解析。

从使用的角度看, 可以分为三类:

  1. 用户手动抛出的
    E_USER_NOTICEE_USER_WARNINGE_USER_ERRORE_USER_DEPRECATED
  2. 用户造成的
    E_NOTICEE_PARSEE_WARNINGE_ERRORE_COMPILE_ERRORE_COMPILE_WARNINGE_STRICTE_RECOVERABLE_ERROR
  3. php内核造成的
    E_CORE_ERRORE_CORE_WARNING

从是否终止程序执行的角度看, 可分为两类

  1. 终止程序执行
    程序终止, 进入处理错误流程

  2. 不终止程序执行
    产生错误, 但程序仍可以继续执行, 同样进入错误处理流程

对于PHP中的错误类型, 可以参考这篇更详细的文章--PHP的错误机制总结

运行时配置

手册--运行时配置讲解的很详细, 但有几个配置仍需特别注意

  1. error_reporting
    报告错误的类型, 建议在开发/测试环境配置成E_ALL, 解决所有的类型的错误后, 在生产环境配置E_ALL & E_DEPRECATED, 则表明:报告除废弃错误外的所有错误

  2. display_errors
    是否显示错误, 在生产环境中配置成false, 配合上面error_reporting的设置, 则表明: 报告除废弃错误外的所有错误, 但不显示错误信息.

  3. log_errors
    错误记录是否开启, 生产环境需开启. 配合上面的两项配置, 则表明: 报告除废弃错误外的所有错误, 不显示错误信息, 但记录(只有php自己可以操作错误信息)到日志中.

  4. 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');...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相关的知识点都涉及到了. 建议阅读源代码.

转载于:https://www.cnblogs.com/zcbing/p/6637926.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/488745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是智能仓储?一文带你彻底搞懂!

来源:机器人网什么是智能仓储?智能仓储是仓库自动化的产物。与智能家居类似,智能仓储可通过多种自动化和互联技术实现。这些技术协同工作以提高仓库的生产率和效率,最大限度地减少人工数量,同时减少错误。在手动仓库中…

assign深拷贝_Object.assign 深拷贝?浅拷贝?

Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。Object.assign(target, ...sources) 【target:目标对象】,【souce:源对象(可多个)】1.如果目标对象中的属性具有相同的键,…

python交互模式运行py文件_对Python的交互模式和直接运行.py文件的区别详解

很多初学的小伙伴总是搞不清交互模式和命令行模式,下面一起来了解一下。 看到类似C:\>是在Windows提供的命令行模式,看到>>>是在Python交互式环境下。 在命令行模式下,可以执行python进入Python交互式环境,也可以执行…

HTML文件属于void值吗,使用HTML :: TreeBuilder查找html文件中的值

找到与匹配内容,在这种情况下,“磁盘空间使用情况”,然后找到下一个。一旦你有一个元素树:my $usage $t->look_down(_tag > td,sub {$_[0]->as_trimmed_text() ~ /^Disk Space Usage$/})->right()->as_trimmed_te…

SQL Server-基础-经典SQL语句

1 经典SQL语句2 基础3 1、说明:创建数据库4 CREATE DATABASE database-name 5 2、说明:删除数据库6 drop database dbname7 3、说明:备份sql server8 --- 创建 备份数据的 device9 USE master10 EXEC sp_addumpdevice disk, testBack, c:\mss…

什么是具身认知?反身理论?

来源:人机与认知实验室 具身认知(Embodied cognition),也称“具体化”(embodiment),是心理学中一个新兴的研究领域。具身认知理论主要指生理体验与心理状态之间有着强烈的联系。生理体验“激活”…

spring字符串判空_字符串工具类StringUtils实现字符串是否中文、字符串分割/判空/替换/查找、是否包含乱码及字符串数组合并等常规操作...

一、前言关于字符串工具类StringUtils实现字符串是否包含isChinese中文、是否包含isMessyCode乱码、常规数据类型转换、替换/删除/判空、两字符串数组mergeStringArrays合并、删除trimArrayElements字符串数组指定数组元素、字符串去重removeDuplicateStrings处理、字符串集合转…

成人高考 计算机英语作文,2017年成人高考英语作文范文

本文“2017年成人高考英语作文范文”,跟着出国留学网成人高考频道来了解一下吧。希望能帮到您!假设你叫王红,于5月7日星期五在学校门口看到两则海报后,决定邀你的好友Harry一起参加其中的一项活动。你赶到Harry住处时,发现他不在。…

todo已完成任务_这么多Todo工具,总有一个能让我告别拖延症!

写下这个标题之后,本喵就陷入了沉思:这个世界上,真的有能让人告别拖延症的工具吗?或者拖延症这个东西,真的需要告别吗?但不管怎么样,该有的todo工具还是要有毕竟,只有好好规划了待办…

php后台接受上传图片

配合上个博文的&#xff0c;捣鼓了一个php后台的东西&#xff0c;虽然不怎么懂&#xff0c;但慢慢来&#xff0c;还是可以的。传送门 java太不好学了&#xff0c;玩玩php&#xff0c;满足一下自己。 那个图片压缩的效果很明显&#xff0c;居然压缩了好几倍。 <?php header(…

【数字孪生】关于数字孪生的冷思考及其背后的建模和仿真技术

来源&#xff1a;系统仿真学报张霖 北京航空航天大学教授。曾任国际建模仿真学会(SCS)主席&#xff0c;北 航自动化 学院副院长等&#xff0c;现为ASIASIM主席&#xff0c;中国仿真学会常务理事&#xff0c;SCS Fellow&#xff0c;复杂产品先进制造…

合泰单片机做电压表_启士 | 蓝桥杯零基础单片机教程9 I2C介绍(上)

这是 北航士谔书院 的第 940 篇推送北航士谔书院X大班提醒您&#xff1a;道路千万条&#xff0c;学习第一条不搞单片机&#xff0c;开学两行泪——新春快乐&#xff0c;我们又回来了&#xff01;本文对 IC 总线的协议做出详细的介绍&#xff0c;并对其在 51 单片机上的应用代码…

计算机网络画出发送窗口变化,2010年7月计算机网络原理试题及答案

全国2010年7月计算机网络原理试题一、单项选择题(本大题共24小题&#xff0c;每小题1分&#xff0c;共24分)1.由一组用户群构成、不需要基站、没有固定路由器的移动通信网络是( C )A.蜂窝通信网B.无线局域网C.Ad hoc网络D.虚拟专用网2.广域网WAN一般采用( D )A.“广播”传输方式…

webpack打包测试_2020年了,再不会webpack敲得代码就不香了(近万字实战)

前言2020年即将到来,在众多前端的招聘要求里,webpack、工程化这些字眼频率越来越高。日常开发者中&#xff0c;我们常常在用诸如vue-cli、create-react-app的脚手架来构建我们的项目。但是如果你想在团队脱颖而出(鹤立鸡群)、拿到更好的offer(还房贷)&#xff0c;那么你必须去深…

大楼(bzoj 2165)

Description xz是一个旅游爱好者&#xff0c;这次他来到了一座新的城市。城市中央有一幢高耸入云的大楼。这幢楼到底有多少层呢&#xff1f;据说和非负整数的个数是一样多的。xz想爬上这座大楼来观赏新城市的全景。这幢大楼的楼层从下至上用从小到大的非负整数编号。每层楼有n个…

可解释性 or 准确性?AI 模型就一定不能两者兼得吗?

来源&#xff1a; AI科技评论编译&#xff1a; 张大倩编辑&#xff1a;丛末模型的可解释性&#xff0c;已然成为了AI 领域最具挑战性的主题之一。一般规律中&#xff0c;模型的复杂度和准确性往往是正相关的关系&#xff0c;而越高的复杂度也意味着模型越可能无法实现可解释性。…

仓库温度湿度控制措施_药品仓库如何保持温湿度均衡?

各种药物器械本身的性质不同&#xff0c;储存的方式也就有所不同。一般常规的药品储存在温度10度-30度的仓库中最适宜&#xff0c;避免高温使药品因为受热&#xff0c;或低温潮湿&#xff0c;使受潮湿而发霉变质变形。药片更容易受潮&#xff0c;一般储存的仓库温湿度要在45%-7…

mysql双机热备实现

说明 机器A&#xff1a;&#xff08;172.16.1.251&#xff09;&#xff0c;机器B&#xff1a;&#xff08;172.16.1.252&#xff09; 两台机器都创建数据库web&#xff1a;create database hello default charset utf8; 实现步骤 双向热备份&#xff1a;首先设置A上数据库为mas…

在疫情防控一线,技术能发挥什么作用?

来源&#xff1a;雷锋网新型冠状病毒感染的肺炎疫情在继续扩散。 截至 2020 年 1 月 26 日 24 时&#xff0c;国家卫生健康委收到 30 个省&#xff08;区、市&#xff09;累计报告确诊病例 2744 例&#xff0c;现有重症病例 461 例&#xff0c;累计死亡病例 80 例&#xff0c;累…

爱荷华大学计算机科学专业,爱荷华大学计算机科学专业好不好?专业设置详情一览...

自从计算机诞生以后&#xff0c;关于和计算机相关的行业发展的是越来越快&#xff0c;其中计算机科学专业就是其中一个&#xff0c;计算机专业的飞速发展对于人类的生活起到了重大的帮助&#xff0c;生活也发生了翻天覆地的变化&#xff0c;而美国是计算机的发源地&#xff0c;…