php异常处理机制

转自:https://www.cnblogs.com/water0729/p/5802476.html

php异常我们常接触到的就是error错误码1,warning错误码2,notice错误码8这三类。出现error了系统是挂掉了,但是warning和notice是我们可以捕捉并处理的

 

php配置项
display_errors=On On将错误显示到浏览器上,不管是On还是Off都会记录到你错误日志里面,前提是配置了错误日志log_errors和error_log

error_reporting 设置错误报告级别,这个与display_errors和error_log有关,只会将对应的错误记录在错误日志或者打印到浏览器上


php错误处理机制
php本身有一套错误处理机制,就是通过display_errors error_reporting来控制
所以默认情况下,在代码出现问题,notice warning等消息时,会直接打印到浏览器上,而且还会继续往下执行,这个时候你通过 try catch根本捕捉不到,这就和我理解的不太一样,
因为我以为的会是错误直接被我catch捕捉到,

所以php的try catch 能捕捉到的只能是你自己 throw new Exception("");的错误,throw之后的语句会进入到catch中继续执行。

如果你想抛弃php自身的错误处理机制,这个时候可以通过set_error_handler这个函数,自定义一个函数用来处理,再这个函数中你可以抛出异常,然后再通过catch捕捉到异常。


这样的意义就是,当出现notice和warning时,比如在mysql连接失败时,会出现warning,但是这个warning你又不能直接通过catch捕捉到,不考虑关闭display_errors,
然后设置error_reporting,通过判断connect返回的句柄,来手动throw抛出异常

 

set_error_handler()也不能用来处理所有的错误级别,官方手册上是这样说的:

The following error types cannot be handled with a user defined function: 
E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING, 
and most of E_STRICT raised in the file where set_error_handler() is called.

 

最后再提供一个小技巧,对于需要使用第三方类的时候可以考虑这样子

 

1.通过__call()方法,这样做的好处就是避免了,再使用没有定义的方法的时候,会报error的错误,error是会让整个系统挂掉的。

2.第二个方面配合set_error_handler()方法设置的自定义错误处理函数,就相当于在调用函数方法的过程中就已经封装了异常处理,我们只需要判断函数处理结果是false(或者是其他的一个字符串)就好了。可以用来判断函数是否调用失败,比如connect。

 

还有一点需要注意的是,php throw出来的异常,必须要catch到,不然会报错。php的异常也像JAVA的异常的一样,可以在最外层catch捕捉,也可以在throw的地方捕捉。

转载于:https://www.cnblogs.com/xiaqiuchu/articles/10398530.html

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

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

相关文章

IDEA中使用Maven

Maven的安装与使用 安装 1、下载,官网下载。 2、解压,存放路径中不可包含空格和中文。如:"E:\dev\workspace\maven\apache-maven-3.6.0" 3、配置本地仓库,进入 "conf/settings.xml" 中,在 setting…

python用turtle画彩虹_Python利用turtle库绘制彩虹代码示例

语言:PythonIDE:Python.IDE需求做出彩虹效果颜色空间RGB模型:光的三原色,共同决定色相HSB/HSV模型:H色彩,S深浅,B饱和度,H决定色相需要将HSB模型转换为RGB模型代码示例:#…

MongoDB事实:商品硬件上每秒插入80000次以上

在尝试一些时间序列集合时,我需要一个大数据集来检查我们的聚合查询在增加数据负载的情况下不会成为瓶颈。 我们解决了5000万份文档,因为超出此数目我们仍然会考虑分片。 每次事件如下所示: {"_id" : ObjectId("5298a5a03b3…

day 17python 面对对象之继承

一:什么面向对象的继承? 比较官方的说法就是: 继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称…

mybatis源码_Mybatis源码之SqlSession

SqlSession简介Mybatis是一个强大的ORM框架,它通过接口式编程为开发者屏蔽了传统JDBC的诸多不便,以简单的方式提供强大的扩展能力。其中的接口式编程就是指日常使用的Mapper接口,Mybatis借助动态代理实现了sql语句与Mapper的接口的动态绑定&a…

r语言kmodes_聚类分析——k-means算法及R语言实现

我们知道『物以类聚,人以群分』,这里并不是分类问题,而是聚类问题。两者主要区别在于,分类是将一组数据根据不同的类区分,已经知道有哪些类,也就是数据已经有了类的标签。而聚类是一种事先不知道有多少类&a…

VSCode安装jshint插件报错

Mac电脑上使用VSCode安装jshint插件时提示如下错误: Failed to load jshint library. Please install jshint in your workspace folder using npm install jshint or globally using npm install -g jshint and then press Retry. 按照提示,使用np…

集合框架总结

2019作为新的一年开始,我也着手面试的准备。这篇的博客的主角集合--面试中都会出现的,所以今天特作此总结,也算是复习的成果的一个展示。在查看了许多的博客和源码后我决定将其分成3部分来总结。 三个部分分别是:集合的分类、各个…

调查内存泄漏第2部分–分析问题

这个小型系列的第一个博客介绍了如何创建一个非常泄漏的示例应用程序,以便我们可以研究解决服务器应用程序上基于堆的问题的技术。 它展示了Producer-Consumer模式的一个大问题,即消费者代码必须能够至少与生产者一样快(如果不是更快&#xf…

调查内存泄漏第1部分–编写泄漏代码

前几天,我发现了这个小问题:该服务器运行了一段时间,然后掉下来了。 然后通过启动脚本重新启动,整个过程重复进行。 这听起来并不那么糟糕,尽管对数据的损失很大,但对业务的重要性并不重要,因此…

[NOIP2013]火柴排队

嘟嘟嘟 首先可以想到,最小距离一定是a中第 i 大的和b中第 i 大的在同一行。 然后先把a,b分别离散化,然后开一个标记数组,map[i]记录a中第 i 小的数在哪一个位置出现,然后对b数组处理一遍。 题中说交换次数,…

2018秋季C语言学习总结

转载于:https://www.cnblogs.com/noacgnnolife/p/10413255.html

解决Charles手机安装SSL证书后,获取到的接口为unknown,且乱码问题

按照正常流程将Charles安装并设置代理后,手机添加完代理并安装SSL证书,尝试抓取接口时,获取到的接口为unknown且返回内容乱码,如下图所示 解决办法: 在Proxy-SSL Proxying Settings-SSL Proxying下添加想要抓取的服务地…

Sum of Even Numbers After Queries

Solution: 转载于:https://www.cnblogs.com/Julietma/p/10414394.html

Python学习week7-文件操作

1、文件IO常用操作 # 文件操作命令 2、打开操作open # open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 创建并打开一个文件test,然后关闭;打开一个文件,返回一个文件对象(流对…

风险定量分析工具 龙卷风图 决策树形图 蒙特卡洛模拟

龙卷风图:是项目管理中用于在风险识别和定性分析之后,进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 敏感性分析:敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不确定因素保持在基准值的条件下…

推土机:将JAXB对象映射到业务/域对象

Dozer是开放源代码( Apache 2许可 )“ Java Bean到Java Bean映射器,可将数据从一个对象递归复制到另一个对象”。 正如从其主页上的描述所描述的那样,它用于映射两个JavaBeans实例,以在实例之间进行自动数据复制。 尽管…

openssl不是内部或外部命令_OpenSSL新架构蓝图

概述日前OpenSSL官网公布了未来OpenSSL的架构蓝图。作为战略性的架构目标,需要大量的版本迭代本文档概述了OpenSSL战略架构。它需要多个版本的迭代从目前最新的版本1.1开始直到3.0甚至是4.0最终实现。由于版本架构变动非常大,涉及大量的变化和迭代&#…

休眠事实:始终检查Criteria API SQL查询

Criteria API对于动态构建查询非常有用,但这是我使用它的唯一用例。 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时,都有一个API动态构造查询是有意义的,因为串联字符串始终是我所不愿使用的路径。 问题是,您是否知道…

treegrid,可以展开的jqgrid树

效果图 html部分 <div class"padding20 bgWhite marginTop20"> <div class"cus-grid row" id"grid-wrap"> <div class"col-lg-12"> <table id"list2"></table> …