非常机制大家在项目都会利用到,但对付框架的非常事理你知道吗? 以及框架里面有缺点但是它便是不抛出来,直接500做事缺点。如何办理呢?
一、TP6非常有那些类型TP6的对PHP版本是>7.1.0
以是框架底层的非常捕获是继续了Throwable缺点非常接口。以是全体框架都是基于该接口来操作的。可能有的小伙伴说,一样平常非常捕获不是用Exception吗?为什么是Throwable呢?
那是由于Exception类是实现了Throwable接口,从而来方面我们调用。接口如果不实现它有用吗?实现流程:TP框架的Exception类继续PHP底层Exception类,底层类再去实现Throwable接口
注:Throwable可参加上一篇文章PHP7缺点非常
TP6共用8大非常类型,在vendor\topthink\framework\src\think\exception下面:
分别是:缺点非常、文件非常、系统非常、HTTP非常、HTTP相应非常、造孽数据非常、路由非常、数据验证非常
个中ErrorException是缺点非常,这也是为什么像PHP的语法缺点框架可以捕获的缘故原由。
而大家常用的Exception类来抛出非常,它就会去实现该PHP底层缺点非常类,而像ErrorException也会去实现Exception基类。以是大家可以把它理解为运用逻辑操纵的基类。而像Http、Route、Valide它们会去继续PHP底层的RuntimeException
RuntimeException还是会继续Exception
RuntimeException类的继续办法
常常利用的getMessage、getFile等方法都是来源于我们的Throwable接口
二、非常捕获的事理解析TP6框架有2中办法,分为手动与自动捕获。手动捕获非常是基于try-catch构造来进行捕获。例如:
try { echo 44; throw new Exception('我是手动抛出来的');} catch (\Exception $e) { // 这是进行非常捕获 return json($e->getMessage());}//实行结果:44\"大众我是手动抛出来的\"大众
把稳:PHP非常是不抛出不实行的,这里的手动抛出是指,当我们throw抛出后。它会不才面的Catch里面进行捕获。而不是说你都不 throw new Exception工具。就可以不才面捕获到非常
抛出非常便是去实行 了tp的定义的Exception类,也便是我们在框架目录下面的vendor\topthink\framework\src\think\Exception.php类
那自动是怎么实现的呢?
自动实现是我们再去启动框架的时候会把它自动的注入到容器里面并绑定关系的。一开始是没有,当运行后就会绑定起来。
绑定后的关系,array_merge是合并多个数组为一个。如果有多个关系就合并用一个来绑定。终极就有think\exception\Handle=>app\ExceptionHandle 的关系
这也是为什么TP6已经默认实现其全局的自动非常类,你可以不用再去实现了。而这个实现的类便是app\ExceptionHandle类库。也便是框架里面绑定的做事实例都会在框架载入的来启动。
那这个自动办法 也须要调用方法啊?你不调用怎么实行呢?
当我们绑定实例化关系后,然后再绑定实例给容器后,我们就会去实行HTTP要求,它便是HTTP下面去捕获我们非常的。
看到了吗?,当我们去实行要求的时候,如果有非常抛出,那就会被Throwable接口管理到。接口的触发便是在于类库去实现了接口的,这个 比较好理解。然后我们就会调用前面注册到容器里面的Handle::class--->report()方法
三、框架运用缺点不抛出的办理方案框架运用的缺点不抛出是在于框架默认只是去捕获HTTP要求的处理,而不会浸染于运用。以是如果是你运用下面涌现问题,它是抛不出来,这个大家后面写代码的时候一定要去把稳到,不然到时候就尴尬了
例如:配置文件Log.php有语法缺点,但是你去访问方法的时候就直接报500,而不是抛出非常,如果你的运用配置接口不对也是一样的
那这个是怎么造成的呢?
这个是由于在我们去实行要求实现自动抛出的时候,须要在容器里面去反转实例,当我们的缺点运用缺点的时候,我们就会进行Error的缺点注册机制里面去捕获,它 不是属于普通缺点非常捕获机制。而在运用缺点捕获,我们是把缺点信息打印到掌握台上,以是它不会输出到我们浏览器上面
如何办理:大家可以用debug来调试下,就可以看到他直接打印到掌握台上
希望大家有收成,对付框架源码解析。我会不定期更新。大家可以留言或者关注发私信。我会根据大家见地来更新技能文章。
年轻就要折腾