00:00
那什么叫做统一异常处理呢?统一异常处理呢,从字面意义上来看,就是统一处理项目当中的异常,那么既然我们项目当中可能会时不时的发生异常,我们肯定是需要处理它的,那么具体如何处理呢?我们希望呢啊,我们项目当中所有的异常呢,我们都有一个标准的一个处理方案啊,所以呢,这个就叫统一异常处理好,那接下来呢,我们在我们的项目当中呢,先制造一个异常,我们就按笔记当中的内容吧,比如说咱们在我们的实体类当中,如果忘记配置这个eate这样的一个列名和属性的映射了的话,那会发生什么呢?我们来试一下,我们打开我们的实体类。在这面呢,我们选择integral gradereid,好,接下来呢,我们选择我们的这个deleted这个列啊,然后呢,把这个D呢给它屏蔽掉,然后呢,我们重新启动一下我们的服务器。
01:10
好,我们重新启动完服务器之后呢,我们来看一下我们之前的这些功能,比如说我们随便找一个功能吧,就找这个列表查询这个功能,Try it out execute,好,大家看这个地方responsibility就发生了这个错误是不是,然后我们得到的结果呢,是500啊,就是响应结果是500 details呢是IR,然后具体的内容呢,就是这样的一些内容,那这个呢,是标准的HTTP,响应结果里面呢,包含time step呀啊,包含status呀,包含AR啊,包含message呀,包含这个具体的接口,错误发生的路径啊等等,那我们希望呢,我们的这个统一错误处理,第一,首先我们即使是错误也要和我们的统一返回结果保持一致,也就是说我们希望呢,使用我们的统一返回结果来展示我们的统一错误对象,无论是成功还是失败啊,都由我们的统一结果来处理,所以呢,这个呢就是我们的第一个目的啊。
02:10
第二个目的呢,就是呃,处理项目当中异常的部分的内容呢,我们希望呢,有一个全局的一个处理方案,好,那所以呢,接下来呢,我们就来看一看,那首先呢,我们来说怎么样让我们的这个项目当中啊,这个既能拥有一个全局的处理方案,又能够用我们的统一结果来返回这个统一异常的,我们需要呢,在我们的项目当中创建一个统一异常处理器,那这个统一异常处理器呢,我们创建在古力common里,好在古力common里面呢,我们新建一个包叫exception包。把这个名字呢,改成exception好,然后在这个exception包下面呢,咱们新建一个class啊,这个class呢,我们就叫统一异常处理器you。
03:00
Find,这是统一的意思啊,然后呢是exception a这个名字其实起什么都无所谓啊,就是我们给它起个名字handle了,Unified exception handler这个呢就是我们统一异常处理器了,那它之所以能够处理我们项目当中发生的所有的异常呢,是因为它有一个叫做。Controller advice啊这样的一个注解啊,那这样的话,一旦我们项目当中发生异常,它呢就会自动的跑到这个方法当中来执行,所以这个方法呢,其实就相当于我们项目当中的一个异常切面啊,所以大家回顾一下a op的概念,就切面编程,是不是这个就是很典型的一个异常切面了,好然后接下来呢,在这个类里面呢,我们会定义一系列的异常处理方法,Public,那么异常处理方法呢,会呃处理我们的具体的异常信息,并且呢,给我们的呃前端返回一个值,也就是说当发生异常的时候,比如说当我们刚才调用的这个类似方法。
04:10
这个类似方法一旦在去执行这个类似具体业务的过程当中,它发生了异常,那为什么会发生异常呢?我们看,因为刚才呢,我们删了一个注解啊,删完这个注解之后呢,就导致我们的应用程序当中,他查询的时候在这呢啊,查询的时候他要查询的是deleted这个字段了,而不是is deleted字段了啊所以呢,数据库表中根本就没有这个字段,所以呢,在我们的系统当中的这个位置就报错了,那报错了怎么办呢?它实际上呢,就马上就停止运行了,根据我们学的异常处理的概念,对不对,那不会返回到这个地方了,那它会去哪呢?会直接去我们的unified exception controller handler里面来做处理啊,那unified exception controller handleler里面会有一个方法,专门的来处理我们的这个啊异常啊,就是捕获我们的这里面发生的异常,也就是说整个作为一个切面啊,然后切到我们正正常的业务逻辑当中了,然后呢,处理完异常。
05:10
之后它就在这个方法中直接返回了,所以既然这个方法是我们的统一返回异常结果的方法的话,那么它也应该是一个R对象啊,返回R对象,然后接下来呢,我们写一个方法handle,这个方法名也是一样,我们自己起名啊,A exception,好,然后在这个地方呢,我们写a exception e啊,然后呢,就可以捕获我们的任何的一个异常,只要在我们的应用程序当中啊,从controller开始到service,一直到matter,只要出现了异常,那么它都会啊,最终啊是exception的子类对不对?那如果是exception的子类对象的话呢,那么在这个地方我们用exception去捕获这个异常呢,是完全可以的啊,所以呢,所有的异常都会统一走到这个方法当中来,那这个方法呢,我们想让它啊,也作为一个Jason结果返回到前端,所以呢,这个方法呢,我们应该有一个Bo body这样的一个返回结果,但是呢,实际上未来这个类。
06:10
里面的所有的方法呢,我们都会作为一些啊异常处理方法,所以呢,我们就直接可以在这个地方写rest controller advice就可以了,那这样的话呢,这里面所有的方法呢,它默认都是以responsibility的形式返回的,好那么这个类里的这个方法为什么会被自动的调用呢?因为这边呢,我们有一个注解叫exception handler,好,我们这个exception handler里面,它要处理一个具体的一个异常对象,它处理什么呢?它就处理这个exception类型的,所以呢,所有exception类型的这个异常被捕获了之后呢,以及它的子类类型的对象被捕获了之后呢,都会来到这个方法当中来处理,那么在这个地方呢,我们直接去打印一下这个日志哈,比如说这边们可以写删了。放缀啊,然后呢,这边我们可以写love.error啊,然后呢e.get message,把这个日志呢给它打印出来一,然后接下来呢,这面我们就return2.2好,那这块呢,就是我们做的一个统一异常处理了,那么。
07:19
接下来呢,我们还要做一件事情,要做什么事情呢?就是现在呢,我们这个异常类呢,是写在了奶的包里面呢,是写在了这个com艾特硅谷common包里哈,所以呢,它呢,因为有了这样的一个rest controller advice注解,它是spring的一部分,那所以呢,我们应用程序在启动的时候呢,应该能够去扫描到这个类才可以,这样的话呢,才能够把这个类呢,初始化到我们的项目当中,然后进而呢,在发生异常的时候,它自动的来到这个地方来处理,所以呢,我们来看一下我们之前的这个扫描。我们之前的这个扫描呢,扫描到的是啊,Come at,硅谷S2B,那很显然呢,不包含come at,硅谷common,所以呢,在这个地方我们添加一个扫描的位置啊,就是com.at。
08:08
硅谷点common啊啊,这个是我们最终的一个扫描处理的一个方案,好,然后这个写完了之后呢,我们来进行啊,重新的一个测试。好,今天我们就启动成功了,启动成功之后呢,我们来。嗯,直接测试一下它就可以了,看一看这回的结果是不是和上次是一样的啊,我们点击I,然后大家看现在这个结果,其实呢,就是一个统一的一个错误处理了,通过统一异常的形式来返回我们统一的二对项,然后在二对项的呃,这个当中去碰装我们的错误信息以及错误码,好这个是我们的通用的一个异常处理方案啊。
我来说两句