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'); ... 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的错误处理的问题的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。
