目录
PHP的错误处理机制
基础知识
预定义常量
运行时配置
错误处理函数
终止脚本执行的错误如何处理
异常
总结
学习资料
首页 后端开发 php教程 PHP的错误处理的问题

PHP的错误处理的问题

Mar 26, 2017 am 09:18 AM

PHP的错误处理机制

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

基础知识

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

  • 预定义常量

  • 运行时配置

  • 异常

  • 错误处理函数

预定义常量

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

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

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

  1. 用户手动抛出的
    E_USER_NOTICE, E_USER_WARNING, E_USER_ERROR, E_USER_DEPRECATED

  2. 用户造成的
    E_NOTICE, E_PARSE, E_WARNING, E_ERROR, E_COMPILE_ERROR, E_COMPILE_WARNING, E_STRICT, E_RECOVERABLE_ERROR

  3. php内核造成的
    E_CORE_ERROR, E_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_handlerset_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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

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

我后悔之前不知道的 7 个 PHP 函数 我后悔之前不知道的 7 个 PHP 函数 Nov 13, 2024 am 09:42 AM

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

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

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

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

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

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

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

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

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

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

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

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

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

See all articles