00:00
那这个内容中呢,给大家演示统一异常处理,那首先我们先来看一种效果。什么效果呢?比如现在啊,为了明显,我就给大家咱们手动模拟出一个异常,咱手动来个异常。比如说咱们手动异常,我就直接写一个啊,写一个最简单的异常。加上这个值除以零。是不是有异常,因为大家都知道零是不是做除数啊,那我下面啊,把这异常加上,咱先看目前,比如这个接口方法,比如咱执行看目前会有什么样效果,然后咱把这问题给他最终解决一下啊,就是对这异常做一些处理,因为在实际的项目中,比如咱不能让用户看到那个错误那种页面,让他看到是一些友好性的提示。那我们来试一下啊。因为我刚才加的这个方法应该是里边的,就是呃,这个方法啊,然后在里边,比如现在我是刚才手动模拟了一个异常,我们现在点try out,大家看目前的结果。
01:06
我们清楚的看到是这段结果,你看是什么?一个状态码是不是叫500状态码啊,他给咱们返回了一个500的状态码。这状态码各位要知道啊,你肯定我们都见过500吗?一般来讲都是你的代码有问题,或者说服务器内部报错了,但是咱现在你发现它现在返回结果是这个东西是一个500的一个错误界面,而我们现在不能让他返回它,让它返一个统一个结果,比如你出现500还是要按照我们那个R那个类的方式进行返回,这是我们要对异常做的处理,那咱要怎么进行处理,下面啊再来写一下这个处理方式啊,其实方法并不难。那咱看一遍,然后我来写啊,它的做法就是咱们可以建这么一个统一异常除以类,这个类为了咱们能通用,我也给它放到common里边,然后加完类之后,在类上边加个注解叫controller advice啊,然后加完之后在里边我们加个方法,就是当你这里边有异常,它会执行这个方法,然后返回我们统一的数据啊,咱们现在就这么来做。
02:12
那我这里边啊,给大家咱就来写一下啊,这个做法啊。首先第一个我们就在common里边做添加,Common中的为了明显我先给它创建一个包。比如我叫一个section,这个handler。啊and啊,咱就叫这个名字了,一个三看到了,然后在里边呢,我们建一个叫统一异常处理类这类的名字词点起啊,比如我就叫global s handle的,然后建完类之后,在类上边咱需要加上一个注解,这注解叫做controller advice啊,就是加这个主体,然后加完之后在这个方法中,就在这个类中咱需要建个方法,这方法作用就是当你出现什么异常,对方会执行,咱需要做个设置啊,那我来写一下啊,比如这个方法我就来一个。
03:07
Public让他咱都反映一个R对象,然后放下名字,比如我叫这个I。啊,名字随便起啊。然后在I里边,咱给它加上一个那个异常,我就来一个叫exception啊,然后加完之后,最后比如把这异常咱给它做个打印,然后最终我们做一个退,比如R点这个IO。啊,AOL,然后点上,比如加一个message啊,就是一个数据。这个啊,咱一会儿完善啊,就这个数据我就写一下,就是执行我们这个叫。全局异常处理啊,就加上一个提示,然后加完之后呢,咱需要在这方法上边做件事情,就是要指定。当你出现什么异常,就是出现啊什么异常它会执行这个方法啊,你就要加这么一个设置,那怎么设置呢?在方法上边有个注解,这个注解叫exception handler,它是一个异常处理器里边加上你那个执行到异常那个class,比如咱加exception,那所有异常他都会用这个方法啊。
04:14
这是我们加这个东西,那我们来加一下啊,它叫做exception handle了,里边加上你那个异常的class,比如加个exception.class那这里边所有异常都会执行,但因为咱们现在要返回数据。而数据返回我在上午提到过,但是在controller中因为有这个risk control,所以它能返回,但是现在我这个类它不是在CTRL中,所以你这数据不会返回,所以咱们还需要加个注解,这个注解。就我刚才说过啊,Response body加这驻点目的就是为了能够。返回数据啊,所以这么做就可以了,就当你再有异常的话,它这个方案会执行,然后它输出的就是这个内容,而不是返一个500那个界面。
05:04
啊,这是我们写到叫统一异常处理,它叫做全局的一种方式,就是所有异常都执行。这个啊,咱就要写出来了,但是目前呢,有这么一个小问题啊,各位注意啊,你看啊,这R是报错了,而R比如我们引入啊,大家发现啊,这有之后这个包是不对,因为R咱是不是要有这个common u r,所以这么引入是有问题的,那这里边怎么做的。我刚才提到过啊,咱是不是可以把common u这个依赖引入到three base里面来就可以了啊,那在里边我们做一个引入,因为它要用到我们这个R对象啊。Dependence加个dependence,然后加一个叫common。Us把这个咱给它加上,然后加上之后啊,在这里边咱这个R就可以有这个内容了啊。把它加上啊R。诶,不是这个包啊,稍等先引入啊。
06:02
等它加载完啊。啊,这个我们再记住,这就出来了,叫com at,硅谷com u中R啊,这个咱不要选错,所以这样的话就可以了啊,所以这是我们写的一个异常处理类,这过程我再说一遍啊,咱们在。com里边就创建一个类,类上边加个注解叫controller advice,然后这里边写方法,就是当你有什么异常执行这个方法,那怎么来指定加上你执行那个异常的class,比如我写exception,那所有异常都会执行,然后下面就是。反应的结果,但是结果需要返回,它不是在CTRL中,咱需要加一个叫response body,把这个咱需要加上,这样的话就可以了啊,这是我们写的这个东西啊,但是这么写之后啊,这过程中会有一个问题啊,给大家要说明啊,这个问题是什么啊。你注意啊,大家强调,咱们刚才啊,在wis里边,我是不是引入了这两个依赖,一个叫wis base,一个是不是叫common us,两个都引入,刚才是没有错的,但是你看目前啊,有一个问题,你注意啊,我service base中是不是已经引入了common u,如果说你再这么引入,那造成是不是引入这个就是common u是不是引入多次了,就是你这个所base中引入一次,然后你这里边又有一次,它就引入多次,所以咱们在里边再引的话,你在service中就不需要再引入它了,咱直接引入three base就足够了,因为它里边已经包含了这个叫common u啊。
07:37
都已经包含到了,而这过程不知道各位是否记得啊,在慰问中有一个词叫依赖传递。不知各位是否听过啊,什么叫依赖传递呢?啊,给大家啊,快速画一下啊,什么叫依赖传递?啊,我叫。这么来画一下啊。比如说啊,我们现在按照我们的实际,然后这是我们那个就是呃,Service。
08:03
Edu。然后这是我们的一个叫common。条。然后这是咱说那个叫service。Base啊,Service base,而现在这关系是怎么样的?比如我们现在啊做法就是我在这个就是service base中引入了叫common us,那我现在在service edu中,我只需要把service base引入了,那它引入那这service Switch Switch edu中是不是也会包含这个common u啊,它这个就叫依赖的传递,你base引入了,那这里边的东西它也可以用到啊,所以咱们现在这么一引入,就你这里边不需要都引入,你要都引入会造成它就重复有这个依赖了啊,这个问题可以注意啊,但你写上也没有错,只是后面可能会造成依赖,大量重复的可能会产生一些问题啊。所以各位注意一下啊,这叫依赖传递,也就是说啊,这么来说吧,这是一,就是这是二。
09:05
然后这是三,比如现在二里边包含一,然后三里边包含二,那三里边也会包含一啊,这就叫依赖传递啊,因为它通过二这两个也能建立关系。啊,所以现在这么一个特点啊,那咱下面把这些应该都写完了,然后都写完之后,最后咱们把最终的效果咱来试一下啊,而效果应该怎么样呢?刚才它出现是一个500的错误,而现在如果再有异常出现,不是500应该会把。这句话都有输出,就是写一个执行了全局异常处理啊,用咱们这个R的统一结果啊,这个啊是咱马上测试的效果,那我们来。系统服务器啊,最后咱试一下啊,看这个结果。你注意我说的一个特点啊,第一个就是之前各位学到的,如果你忘记把这给他要知道一下啊,就是may,这个叫依赖传递,二里边包含一,三里面包含二,而三里边也会包含一啊就这个特点就是咱们现在在三里边引入只需要这个service base,不需要再引入com u条,因为它已经帮助咱们引入了。另外就是啊,写这个权益异常处理,就是咱加个类加注解就可以做到。
10:15
啊,另外这个不要忘记response body,为了咱能够返回数据。这个啊完成了啊,然后完成之后咱们打开这个swa,最后来试一下啊。找到咱这个方法,这个方法我们专门加了一个一个错误啊,就是一个手动模拟一个异常,然后现在我点try it out,大家看结果啊,你看什么结果啊,第一个没有出现500,它提示是不是叫执行了全局异常处理,而这个异常处理是不是就是我写的这段文字把这个给我们输出了啊,另外它的异常咱也打印了,就是咱说这个零不做除数啊。什么异常这句话打印了异常,所以现在啊,把这个我们做这个处理,也就是说这个过程在实际中咱肯定都这么做,比如说你的项目运行有异常,那咱返回的肯定不是500错误,而会要返回一个统一的提示,比如说经常各位应该看到很多现象,比如可能提示你什么出错了,什么服务器正在维护啊,什么你进行了非法操作等等,这些都是一些异常的处理的一种提示信息。
11:22
现在啊,用这种方式我们可以做到。这个啊,是咱们讲到的这么一个内容啊,就是全局就是同一张处理中的全局异常处理。我们完成了啊。
我来说两句