文章插图
异常是所有开发者在写代码过程中都会遇到并且要妥善处理的 , 不少开发者认为php无需做异常处理 , 框架本身已经帮我们做好了 , 异常处理是JAVA , C语言才要做的事情 , 其实这种说法是很片面的 , 虽然PHP的框架比如Laravel,Yii等有非常好的异常处理 , 但是他们只是提供了一种工具 , 框架不会去理解业务 , 而在业务逻辑中 , 难免会遇到各种异常处理 , 我们要提升对异常的认知 , 做到在工作中灵活运用 ”
接下来在异常处理这篇文章中,我将从头梳理PHP开发中 Exception 这个关键字的周边知识,争取梳理清楚如下的几个问题
1.什么是异常
2.异常从哪里来
3.异常应该到哪里去
4.异常之分门别类
5.异常和错误的区别和联系
6.异常之于业务场景
什么是异常
在我们开始所有解释之前,我么首先举个栗子. 假设你要按照给定id来查找humans表的用户邮箱,这个功能可以写成这样:
文章插图
但是这绝对不是一个健壮的代码,一旦用户传递一个不存在的id(数据库不存在),或者传递是压根就不是int型的正整数,程序就会进入: PHP Notice 状态,导致整个程序进入非预期流程
这里的非预期流程可能是个PHP层的警告,也可能是个fatal error(假设方法的实现还有更加致命的逻辑假设),导致程序异常终止
所以这时候需要这个方法告诉调用方你的参数有误这种信息,这个时候通常我们的做法有两种.
1.
文章插图
2.
文章插图
而第二种做法就是我们讨论的Exception,好了,到这里我们只是讨论清楚了抛出异常的必要性,但是就如上面两个例子看到的,调用方调用完毕这个方法怎么按照你给的信号(throw 出来的exception)做出合理的处理呢?
异常从哪里来?
上面说清楚了异常的必要性以及可能性,那么异常从哪里来呢?
异常来自开发者对整体代码逻辑的非预期结果给出的提示. 所以简单来说,异常是PHP代码层抛出的. 一般常见的当我们调用第三方接口 , 如果不做异常处理 , 接口异常 , 或者超时 , 都会产生致命性错误 。
异常应该到哪里去
上面已经定义了function getHumanEmailById,同时对参数的非法性做了异常的抛出,但是我们不知道异常到哪里去了,我们尝试调用它getHumanEmailById(1),这里假设id是1的human信息在数据库中已经被删除,看看PHP执行器返回结果:
Fatal error: Uncaught InvalidArgumentException: 参数非法 这里发现,我们抛出的异常居然变成了Fatal error,所以异常抛出后交给了PHP解释器,解释器没有找到 catch 这个异常的逻辑代码,所以直接fatal error,说明这一点
我们继续修改代码
文章插图
执行结果正常输出: 参数非法 在Laravel中 , 内置了非常多的异常处理类 , 如果我们善于观察 , 可能会经常遇到 诸如router 404, 405Method Not Allowed 429 to many request ,model 404 这样的laravel 已经帮我们处理的异常处理 , 当然还是开头那句话 , 我们业务的异常 , 框架是不会帮我们处理的 到此,我们解释清楚了异常应该到哪里去的问题
异常之分门别类
也许你留意到上面的代码没有catch InvalidArgumentException,是因为Exception是InvalidArgumentException的父类,因为异常的类型很多,我们有一些需求确实需要根据不同的异常做不同的事情,例如下面的伪代码:
文章插图
异常和错误的区别和联系
这个主题,我想只有PHP官方PHP5时代的开发才能解释清楚这一点,通俗的来说,错误可能是不可修复的,当然现在的PHP7版本已经将error和exception统一了,他们都集成自throwable这个interface.具体的关系如图
文章插图
PHP7以下的话,我们可以尝试将error转为exception,具体实现代码:
推荐阅读
- PHP验证邮箱是否合格
- 女朋友对我没有分享欲是什么意思,女朋友没有分享欲怎么处理
- 厕所地面漏水怎么处理 卫生间地漏冒粪水怎么办
- 盘子有裂痕怎么修复 盘子裂了怎么处理
- 14项常见身体异常指标解读,千万别忽视
- 治理信阳毛尖茶园除虫的办法和处理方式
- 新生儿夜里不睡觉的处理方法
- 马化腾没跟你开玩笑?微信用户如果有这3种行为将直接封号处理
- 湿疹结痂后该如何进行处理
- 淘宝降权可以消除吗 淘宝降权怎么处理