php中的错误和异常捕获

目录

一: 异常(Exceptions)

二: 错误(Errors)

三:实际项目的异常和错误处理


在PHP中,异常(Exceptions)和错误(Errors)是两个不同的概念,尽管它们都与运行时问题有关,但它们有各自的用途和处理方式。

一: 异常(Exceptions)

异常是在程序运行时发生的,可以预期并且通常被设计为在特定条件下被抛出的异常条件。它们通常用于处理可恢复的问题,比如文件未找到、数据库连接失败等。

捕获异常:

你可以使用 try...catch 结构来捕获和处理异常。

try {  

      //业务代码;  
    } catch (Exception $e) {  

    echo '异常捕获: ',  $e->getMessage(), "\n";  
    }

    
$e->getLine() 返回异常或错误发生的行号。
$e->getMessage() 返回异常或错误的描述消息。
$e->getFile() 返回发生异常或错误的文件名。
$e->getTraceAsString() 返回一个包含异常或错误堆栈跟踪的字符串。堆栈跟踪显示了异常或错误被抛出时程序执行的调用栈。

这个错误很重要哦,当我们的业务调用比较复杂时,可以通过这个发现发生错误的各个代码的行数,方便找到最终的错误源头。

二: 错误(Errors)

错误通常是由不可恢复的问题引起的,比如语法错误、类型错误、调用未定义的函数等。在PHP 7之前,错误通常会导致脚本终止执行,并且没有内置的机制来捕获它们。然而,从PHP 7开始,引入了一个名为 Error 的异常类,使得某些类型的错误可以被捕获和处理,类似于异常。

从PHP 7开始,你可以使用 Throwable 接口来同时捕获异常和错误。

例如

try {  
    // 可能抛出异常或错误的代码  
} catch (Throwable $t) {  
    // 处理异常和错误  
    echo '捕获到异常或错误: ', $t->getMessage(), "\n";  
}

当然你可以做thinkphp6中这样捕获因为Exception继承了Throwable

try {  
    // 可能抛出异常或错误的代码  
} catch (Exception $e) {  
    // 处理异常和错误  
    echo '捕获到异常或错误: ', $e->getMessage(), "\n";  
}

当然在实际使用中发现Exception并不能捕获所有的错误,比如函数名找不到可能捕获不到,需要Error中捕获

try {  
                        // 可能抛出异常或错误的代码  
      } catch( \Exception $e) {

               echo  $e->getMessage();

      } catch (\Error $e) {
                echo  $e->getMessage();
     }

三:实际项目的异常和错误处理

  1. 全局异常处理
    • 使用一个全局的异常处理器(通过 set_exception_handler() 设置)来捕获未被捕获的异常。
    • 在全局异常处理器中,记录错误日志、发送错误报告给开发人员或显示一个用户友好的错误页面。
  2. 错误处理
    • 对于PHP 7及以上版本,使用 Error 类和 Throwable 接口来捕获错误。
    • 设置一个全局的错误处理函数(通过 set_error_handler()),但请注意,它不能捕获所有类型的错误(如致命错误和解析错误)。
    • 在错误处理函数中,根据错误的类型和严重性决定是抛出异常、记录日志还是显示错误页面。
  3. 日志记录
    • 使用一个日志记录库(如Monolog)来记录错误和异常信息。
    • 确保日志包含足够的上下文信息,如时间戳、用户ID(如果适用)、请求URI、错误类型和消息、堆栈跟踪等。
    • 将日志文件存储在安全的位置,并限制对它们的访问。
  4. 用户友好的错误页面
    • 为生产环境配置一个自定义的错误页面,该页面应简洁明了,避免显示过多的技术细节。
    • 在开发环境中,可以显示更详细的错误信息,以帮助开发人员快速定位问题。

 

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

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

相关文章

vuex的store应用

1.在pakage.json加一行 2.和main同级别加一个js文件 import Vue from vue import Vuex from vuexVue.use(Vuex)export default new Vuex.Store({state: {langFlag: new Date().getTime()},mutations: {setLangFlag(state) {state.langFlag new Date().getTime()}} })3.在mai…

NewStarCTF2024-Week2-Misc-WP

目录 1、wireshark_checkin 2、wireshark_secret 3、字里行间的秘密 4、你也玩原神吗 5、Hertas Study 6、用溯流仪见证伏特台风 7、热心助人的小明 1、wireshark_checkin 直接字符串搜 flag flag{ez_traffic_analyze_isnt_it} 2、wireshark_secret 查看原始数据 导出十…

「C/C++」C++ STL容器库 之 std::map 键值对的集合容器

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

鸿蒙网络编程系列25-TCP回声服务器的实现

1. TCP回声服务器实现可行性 在前文鸿蒙网络编程系列2-UDP回声服务器的实现中,介绍了什么是回声服务器,并且基于UDP协议实现了一个简单的回声服务器,本节将基于TCP协议实现一个类似的回声服务器。在鸿蒙API10以后,提供了TCPSocke…

【C++】使用vscode进行 C/C++ 开发,内含c_cpp_properties.json、launch.json 和 tasks.json解释

在 Visual Studio Code (VSCode) 中进行 C/C 开发时,这三个 .json 文件(c_cpp_properties.json、launch.json 和 tasks.json)分别用于配置编译、调试和代码提示等功能。它们是 VSCode 配置环境的一部分,由 C/C 扩展生成&#xff0…

将java项目jar包打包成exe服务

1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等(数据库...) }第一次准备: 1.将打包好的jar包放到premiumServices.exe…

智和信通助力某大型服饰集团建设综合监控运维

某大型服饰集团成立于90年代,是广受认可的国民生活时尚品牌,近年来随着集团公司业务规模的不断扩大,信息化作为支撑集团公司业务发展的重要技术手段,信息系统无论在规模上还是在复杂程度上均有了很大程度的增加。 项目现状 当前信…

计算机网络—vlan(虚拟局域网)

内容补充 冲突域 如果两台设备同时发送数据,他们的数据会互相干扰,那么他们就处于同一冲突域,例如集线器(总线型,所有设备共享带宽)的所有端口都处于冲突域。 广播域 如果一台设备发送数据,…

babylonjs shader学习之copy shadertoy案例

shadertoy案例: 准备 const onSceneReady (scene: Scene) > {const light new HemisphericLight(light, new Vector3(0, 1, 0), scene);light.intensity 0.7;Effect.ShadersStore[planeMatVertexShader] precision highp float;attribute vec3 position;attr…

单片机输出方波

从P1.0上输出一个方波,高电平5ms,低电平10ms. #include〈reg51。h〉 unsigned char flag; sbit outP1^0; void main() { flag0; TMOD0X02; TH06; TL06; TR01; EA1; ET0…

Redis JSON介绍和命令大全

Redis JSON介绍和命令大全 Redis JSON先说说JSON是什么再说说JSON Path先推荐两个网站JSONPath JAVA clents Redis JSON 安装内存json命令语法命令url命令解释JSON.ARRAPPENDJSON.ARRINDEXJSON.ARRINSERTJSON.ARRLENJSON.ARRPOPJSON.ARRTRIMJSON.CLEARJSON.DEBUG MEMORYJSON.DE…

centOS部署Jenkins实现项目可持续自动化部署

个人看的是尚硅谷的视频,跟着实战,但因为视频是21年的,所以很容易出现jenkins插件不适配问题。 因而个人直接用较新版的jdk和jenkins. 先切换到root用户 sudo su一、安装jdk 先查询可安装版本 yum list java*安装jdk(只复制圈…

【算法】归并排序概念及例题运用

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

爬虫日常实战

爬取美团新闻信息,此处采用两种方法实现: 注意点:因为此处的数据都是动态数据,所以一定要考虑好向下滑动数据包会更新的情况,不然就只能读取当前页即第一页数据,方法一通过更新ajax数据包网址页数&#xf…

vscode 预览markdown 文件

1. 点击左边扩展 2. 搜索“Markdown Preview Enhanced” 3. 选第一个安装即可 4. 重启vscode 5. 打开一个markdown 文件 6. 点击右上角的预览按钮

[mysql]mysql的全部单行函数

单行函数 几乎我们认识的语言都会对一些常用的功能进行,封装,有些叫函数,有些叫方法(Java),后期我们还可以自定义函数. 现在我们就当大家是没有语言基础,我们来从头开始讲.不过大家肯定接触过,中学说的函数,yf(x)f代表的就是function的缩写,这里其y2x1fx代表的就是封装的内容…

FileLink内外网文件交换——致力企业高效安全文件共享

随着数字化转型的推进,企业之间的文件交流需求日益增加。然而,传统的文件传输方式往往无法满足速度和安全性的双重要求。FileLink作为一款专注于跨网文件交换的工具,致力于为企业提供高效、安全的文件共享解决方案。 应用场景一:项…

C++大沥2019年真题——数字圈

Hi!大家好!Im#张亿,今天来讲C大沥2019年真题——数字圈 题目描述 当我们写数字时会发现有些数字有封闭区域,有的数字没有封闭区域。 数字 0 有一个封闭区域,数字 1、2、 3 都没有封闭区域,数字 4 有一个封…

word中的内容旋转90度

在vsto、Aspose.Words 中,默认没有直接的 API 可以让表格整体旋转 90 度。然而,我们可以通过一些方式来实现类似的效果,具体思路如下: 将表格插入到一个形状(Shape)或文本框中,然后旋转该形状。…

《RECONX: RECONSTRUCT ANY SCENE FROM SPARSEVIEWS WITH VIDEO DIFFUSION MODEL》论文阅读

论文地址:https://arxiv.org/pdf/2408.16767 项目地址:GitHub - liuff19/ReconX: ReconX: Reconstruct Any Scene from Sparse Views with Video Diffusion Model ---------------------------------------------------------------------------------…