00:00
前面呢,我们了解了一下错误处理里边的一些默认规则,那接下来我们就来了解一下异常处理里边的一些原理,那掌握这些原理以后呢,我们想要实现定制化的这些错误处理,那就非常方便了,那先来看一下我们异常处理里边的自动配置原理,那为什么会有这些默认规则,那一定是在底层给我们自动配置好的,来分析一下这个自动配置原理,我们来参照一下我们的这一个自动配置包,来看哪一块是跟我们这个错误处理有关的,这个自动配置来到这一块,我们来到自动配置包,它这有一个we网模块,我们现在是外网模块,那在这个测自动配置里边呢,有一个so,我们是使用soet技术站,这里边呢有一个arrow,这个arrow呢,是专门来针对于我们错误处理的一些东西,然后呢,其中就有一个叫arrow mvc auto comp,我们一般呢,一看见这个什么东西,Auto configuration,那么就知道,诶,它是关于某一个功能的自动配置,所以呢,我们先来发现了第一处,我们是找到了l mvc auto。
01:00
Toation,它呢是自动配置了,配置了咱们这个异常处理的规则,怎么配置异常处理规则,而这自动配置的这个异常处理规则,它配了哪些东西,我们可以确认一下,而呢,异常有关的相关属性我们可以看啊,所以呢,在这一块呢,他来也enable了,Configuration property,相当于它绑定了一些属性,那就是server里边的,以及我们的这个外BMVC里边的,然后它里边的一些属性呢,都是从这些配置文件里边获取的,那大家知道一下,我们看一下这个自动配置给我们来做了什么,首先第一个给我们at being,给容器中呢放了一个组件,这个组件呢叫default error attributes,它的这个组件名呢,而且是conditional Miss being,但容器中没有这个类型的时候才用这个,如果有那就呃,我用我们自己的,所以呢,我们现在分析到了我们这个自动配置了哪些,我们来看一下,第一个啊,给容器中放了一个这个组件,这个组件呢,它放的ID。
02:00
相当于它的ID呢,应该叫什么?那按照我们这个要求,你这一块没写ID,那就是方法名,作为ID,那就叫error attribute。Attributes这个ID来标注一下,我们放了一个这个类型的组件,组件的类型和组件的ID是这样子的,那它们有什么作用,我们现在呢,可能不能知道,我们只有走源码才能知道,好,现在呢,先放了一个这个东西,这个东西呢点进来,点进来呢它是实现了叫呃,Error attributes,并且呢实现了一个叫handler exception reserve,我们把这个声明呢可以拿过来,那我们提前呢先对它有一个了解,那我们现在呢,相当于给容器中就放了一个它,我们把这个加红显示,那它呢是实现了这两个接口,把这两个接口呢,我们也给大家拿过来,这两个接口呢,我们提前先混一个眼熟,因为我们在后边分析源码的时候也会用到。
03:01
我们就用这个蓝颜色来标识起来,好,现在呢,我们容器中会放一个这个啊,容器中的组件容器中。容器中的组件,首先呢,第一个们看到了它,第二个我们再来看它给容器中放了一个什么,来到它的自动配置,还给容器中呢放了一个叫basic error controller,我们一听这个东西呢,它是一个controller,也是这个类型的,也是condition的啊米森B,所以呢,给容器中还放了一个ctrler,容器中的组件还有一个呢是类型是它,然后呢,它的ID我们可以来记录一下,ID呢是我们的这个,那我们现在呢,默认都是方法名作为ID。这呢是一个ctrler ctrler的作用是什么?那自然是处理请求,所以我们分析到这,我们顺便来分析一下这个ctrler,来看一下它的这个是什么规则,点进来好,我们发现呢,它是request map,它是来映射,映射什么呢?相当于你在这一块叫server error pass,如果你配了这个东西,那我们相当于就是我们映射的路径是动态取得值,如果你没配,然后呢,冒号,那就叫默认值,默认值呢就取出error pass error pass也没配,那就冒号,默认值是一个error,所以呢,相当于我们看到了,诶终于底层呢,这有一个然然它呢处理默认errorrow路径的请求,它处理默认杠A这个径的请求,路径的请求,路径的请求,好,那我们现在呢,把这个拿过来,我们再来确认一下,那我们现在这是一个controlrler controlrler呢,而且它既然能处理请求,我们看到request map request。
04:53
那这就是响应数据的,所以呢,最终它在这一块呢,会给我们有数据的响应,而响应的是什么?我们来看啊,前面呢是produce能产生HTM页面的,后边呢是response n相当于产生接S数据的,所以其实我们看到的两个效果就是大家都跳到了杠errorr,当然杠A这个路径你也可以通过修改这一处的配置来改变,比如我们来看一下这一处的配置。
05:18
这处的配置呢,应该叫应该叫我们的errorrow pass error我们来看一下啊,Error这样一个pass,所以呢我们可以来指定它,指定它呢,它默认叫杠error啊,所以呢,我们是相当于是绑定的配置文件这一块的值,而他处理完请求以后呢,如果谁给我交给它,如果是浏览器,那根据我们这个内容协商浏览器呢,要求HTM,所以呢,我们就调用这个方法响应HTMMR,相应的HTMMR内容是什么,我们可以看,这叫resolve,什么error view点进来,然后它这个页面的内容到底是什么,一会展开看一下啊,它呢会给我们响应一个model and view,大家看啊,我们要响应的页面呢,它相当于给我们响应一个model and view,像我们这个模型及视图像,最终呢,还是会转到这么一个页面,那处理这个请求,然后呢,如果是页面页面响应页面响应响应什么呢?响应这个就是model。
06:19
View响应我们这个error这个页面,响应这个error页面呢,它又是怎么响应的,我们一会儿来分析好,我们现在呢,知道要么响应一个error页面,要么呢就直接response nity,把所有的这个map里边的这些数据给我们来响应出去,相当于一个解S,好那我们现在呢,看到这有一个ctrller了,接下来这还有ant b给容器中呢,放了一个错误页的这个定制化器啊,我们放在这,这个暂时不用管,以及我们来看下边比较重要的这块呢,给我们标注这个东西呢,它是一个过时的啊,过时的呢,我们整个可以不用看它,但是我们在这来看一下,这有一个配置叫conditional,然后呢,我们现在呢,是来判在这配置了一个东西,我们来看啊,给这。
07:05
放了一个叫view叫视图,这个视图的名字呢,正好叫error,所以呢,我们容器中还会放一个这个view u,容器中中还会有一个VU组件,而这个组件的ID它叫L组件view,然后呢,它的ID是error ID是error,那其实大家来想啊,Model and view,我们想要返回物,呃,这个L视图,然后呢,正好容器中有一个这个视图组件,它的名字叫error,相当于呢,如果调用了这个CTRL,然后呢,它最终就会给我们响应这个errorr视图,那就是这个view ID叫errorr的这个view,而ID叫error的这个view长什么样,那就响应什么样,所以我们最终分析它这个view呢,叫static view点进来,而且呢,因为我们知道视图跟视图解析器有关的,所以我们要能按照咱们这个啊,相当于组件的ID找到这个view。
08:05
对象,并且让它作为视图,我们就需要一个视图,以我们这个组件的名作为视图名的这个维有reserver,这是我们之前说视图解析说的这个事情,所以呢,我们看啊,它为了解析到维U这个视图,我们配置了一个叫b name v u reserver啊,我们相当于叫以去容器中按照这个组件的ID去来找一个组这个view视图的解析器,所以它还给容器中放了一个view reserve,容器中放组件叫view receiver,大家记住我们的view reserver是跟view配合起来的,呃,我们知道视图解析器是来最终解析得到视图,视图最终给我们响应是什么,那就是什么,所以呢,我们看到的这一块的内容就是来重新进来。那我们看到的这一块的内容呢,其实就是我们的这个视图解析器,因为它是按照组件的ID解析的,最终呢,你刚才我们的CTRL想要跳转到一个error视图,所以呢按照这个视图的ID,按照ID作为我们的查找,最终找到容器中的这个视图对象,这个视图对象最终长什么样,我们就渲染什么样,我们把这个逻辑呢,给大家在这一块稍微串联一下。
09:24
好,现在呢,我们这儿有一个叫这个视图解析器,这是我们视图解析章节的视图解析器,它的作用呢,这个视图解析器的作用就是按照咱们这个我们返回的这个视图名,我们来看啊,按照返回的视图名,我们的这个视图名呢,叫L作为组件的ID,作为组件的ID,然后呢,去容器中,去容器中找为诱对象,所以呢,我们看到我们给容器中添了一个这个errorr ctrl,以后只要你给我们请求发到errorr路径,它默认呢就会找errorrow视图,而arow视图呢,又是它容器中的一个维U组件,它怎么找到这个errorrow视图,就是利用这个视图解析器找到的这个error视图,L视图呢,最终我们的这个返回值,所以视图的名,这个名呢,作为ID找到这个维U对象,那相当于VU最终渲染是什么呀,那就是什么呀。
10:25
来看他最终找到的这个view u对象,这个view对象呢是default error u再点进来,Defat error u呢,点进来我们发现这一块的render方法是这么来写的,而内容类型呢是test test htm Mr,现在我们要响应一个HTML页面,而里边的所有内容该是怎么写的,那就是在是在这大家看到给build里边碰到了一个HTM2BODY什么什么white error page,这就是我们以前看到那叫白页,这个白页里边的呃,HTM,包括H1标签里边显示是什么,所以这就是一个默认的错误页,最终是通过这响应的,所以这个维U呢,最终是响应的,指的是响应默认错误页,错误页,因为我们的这个响应默认错误页的方法是在这儿的,大家注意啊,是我们这个CTR了,要产生HTML页面的时候才会找到error视图,所以我们来总结一下,总结呢在这我们的这个错误逻辑。如果要想如。
11:25
我想要,然后呢,返回页面,返回页面,所以呢,它就会就会找咱们这个error视图,Error视图,而error视图呢,这个又是默认这个error视图默认是一个白页,白页里边呢,我们里边写了那一堆的那个东西,白页就是这个白眼呢,其实就是我们默认的这个维U组件,而这个尾U组件呢,就叫它。那么最终呢,相当于一步一步剖析,我们就来到这儿,这个维U组件叫static,来看一下啊,我们刚才是找到哪了,我们的这个视图的这个解析器啊,我们最终呢,响应一个视图,这个方法是过时的,就是这个静态的视图叫static of view,好,那这就其实解释了,首先在这个位置我们解释了一件事,就是为什么它既能响应HTML页面又能响应啊杰S是在这个controlrler里边的,这个controlrler里边呢,它有两个处理方法,这两个处理方法呢,分别一个是大家看request,它响应的是response body,这种方式呢,会以解S数据想出写出去,这种呢是写的是杰森,写出去杰森,而还有另外一种是request map,我们看人家明确的说我叫produce。
12:52
HMMR,那么在这呢是来产生HTMMR的,而这个HTMMR的产生,所以HTMMR的错误页默认去哪找,它是找这个错误视图的,所以如果我们想要自定义错误页,也可以自定义一个视图,这个视图的名叫L就行了,所以这叫错误页的。
13:14
逻辑在这,这是这是错误样,好那我们就解释了,为什么既能写杰森又能写错误样,而且错误页呢,为什么是一个白页,那最终呢,这个白页是因为它是一个static of view写死了的白页,好那这是我们这个说异常自动配置里边我们继续来分析,那我们前面呢,分析给里边放了这个CTRL,这个已经过时了,我们就不用管,过时的东西我们都不用分析,然后呢,来到这儿,我们这个白页的这个效果就出来了,剩下的这些东西那都是哎我们的一些条件判断,然后呢,我们这个白叶到底内容是什么样啊,就全出来了,然后我们来看啊,剩下就没有什么东西了,所以我们看到呢,对于我们这个错误的这个自动配置就配了这么多东西,容器中呢,会有一个这个错误的error attributes,但这个玩意又是什么?我们相当于呢,刚才只说明了它是什么,它呢能给我们做两件事,就是呢,响应阶字和响应白页。
14:14
我们把这个杰森加白页来进行适配,哎,适配适配响应就是你如果是浏览器我就给你响应白页,如果是,呃,客户端就响应杰适配响应,这就是我们说的内容协商的方式来进行响应,而我们也可以看一下这个errorrow attributes到底是什么,所以我们来看一下啊,在这个自动配置这一块,那我们把这几个搞定了以后,我们来看自动配置里边其他是什么,当我们这个error controlrler,它是继承于它的,我们就不用看它了,然后呢,接下来这还有什么view server叫视图啊,错误视图解析器,我们把这个错误视图解析器呢,我们也分析一下在自动配置里边有没有加进去,我们这呢,有一个叫default error view reserver,好,就是这个视图解析器,这个视图解析器我们来看一下啊,这个视图解析器它在什么时候用到了,我们在A里边我们来搜一下啊,在它的这个自动配置里边搜一下。好在这。
15:14
我们发现呢,是过时的这一块给我们配了一个这个东西,所以我们接下来呢,就来看过时的这一块,他想配的这一块东西,他又解释了一件什么事,它呢还给我们这个容器中配了一个叫deat error receiver来看啊,这个东西翻译过来还叫视图解析器,只不过呢,它叫错误视图解析器。而且呢,也是容器中没有的时候才配,然后呢,我们来容器中一个组件,两个组件,第三个组件,我们把一个中的。哎,稍等一下容器中的组项,还有一个呢,叫default error view reserve,这个翻译过来呢,叫错误的这个视图解析器,它的名字呢,叫conversion。
16:08
Error receive,它的ID呢,叫它类型呢,是它这个ID呢,倒不住,倒不重要了,来看这个称为我们叫错误视图解析器的人能干嘛,我们随便呢把它点进去,其实我们就能发现点进来他能写的一些代码就在这儿,首先呢,它给map里边映射了一些东西,如果是客户端错误就是四叉叉,如果是服务端错误就是五叉叉,然后呢,接下来大家看啊,既然是视图解析器,视图解析器它们最终呢,肯定要解析得到视图对象,所以我们看这有一个方法叫reserve error5u,先解析得到视图对象,然后呢,接下来它呢,在这一块,在这一块呢,最终会调用这个reserve方法得到一个model and view将要跳转到哪个页面,而reserve方法呢,大家看在这做了一件这个事儿,所以呢,相当于I5U,它会添一个error杠什么,然后呢,接下来这是视图名,所以呢,这就举了一个什么例子呢,而这个视图。
17:08
名是什么,这个视图名呢,我们看啊,调用这个reserve方法的时候,和这个reserve方法第一个参数是视图名,而第一个参数呢,它传的是statuss,所谓的statuss是HTTP状态码,所以呢,其实在这解释了一件事情,如果我们发生了404错误,那这个状态码呢,就是404,那传入的这个视图名就叫404,它呢,就会在L下边找404解释了个什么,解释了个它我们为什么给我们的模板引擎L这个路径下放一个4045叉叉,它就能跳转到这些页面,所以呢,这是我们这一块的有一个默认规则,把这个默认规则呢拿过来,那它里边的这个原理实现呢,它就非常简单啊,如果发生。发生错误,我们呢,会以会以HTTP这个状态码,会以HTTP的状态码状态码,然后呢作为视图页地址,也就是我们说的这个view name,这个视图页地址就是我们说的u name。
18:21
最终呢拼上串,最终呢找到真正的,找到真正的页面,而真正的页面呢,它是这么来拼串的,是凭A下边的我们的这个VO name.htmr,而VO name呢是四叉叉五叉叉,所以呢它这一块是404页面,因为它这个东西呢,是以状态码作为我们这个页面名的,所以是4045叉叉就是这么样的一个效果,所以呢,相当于解释了我们前面演示的这个效果,我们呢,把这个错误页我放到这个A下边,五叉叉404我们就能处理,所以我们发现呢,源码中他们的这些默认规则,我们在源码中都可以找到,但这两个呢,我们可以先简单放在这,而比较重要的呢,还有一个叫我们之前说的default error attributes,这个呢我们一直没有分析,那我们来看它有什么作用,还有来到我们的这个啊,关于错误的自动配置里边。
19:21
给容器中呢,放了一个它来点进来,那点进它里边呢,我们先不说它继承了什么,当然这些东西呢,它实际上这些接口有什么用,我们后来再说,我们主要看它的一些方法,它呢还是返回model and,我U现在返回一个我们最终要跳去的页面地址,然后呢,这个页面地址里边呢,会有一个这么个东西叫store error attributes,相当于保存我们这个错误的这个属性,什么叫错误的属性,那就在这大家看啊,就是呢,我们最终相当于客户端能返回的这些数据里边包含哪些属性,就在这儿放着,然后其实就在devot error attributes里边定义的devot error attributes里边看我们get括error attributes的时候,说我们的这个里边可以包含trans message errors exception,包括还能包含一些基本的点进来,时间戳,对吧,还有状态码,还有错误的细节,还有路径,所以其实在这一块相当于是定义了default error attributes,它是来定义。
20:21
我们最终响应的错误里边能包含哪些内容?哎,我们大概呢,对于我们自动配置的这几个组件分析了一下,它有什么功能,但是他们是怎么联动起来,最终跳转到这个页面响应一些错误数据的,那们下一节课还得分析这个步骤,但是我么呢,每个功能组件大家看了一下就知道了,T error attributes,它就是来定义咱们这个页面中,定义错误页面中可以包含哪些数据。那我们看到的截图呢,就是这样,那默认呢,我们知道呢,包含这些,其实它有一个判断啊,你的有一些,比如它判断is include,哎,你是不是包含将exception,你如果不包含exception,我就从错误信息里边把exception给你移除,相当于默认的这些都是要包含的,所以呢,我们相当于给页面返回的这些东西里边啊,会包含很多的属性,这是一些基本属性,这个里边还有一些基本属性,你把这个拿过来给大家看一下就行了啊。
21:29
这是我们页面能包含的这些基本属性,还有一些基本属性在这个方法里边定义的。那我们一下就能看到呢,是这样子的,我们页面里边呢,可以用到时间戳,对吧?因为它返回的是一个map,能用到时间戳,也能呢,And status打and status这个方法还给页面呢,可以放status这些错误的状态码,哎,给这放状态码,包括呢,我们还可以添加一些错误的细节,添加路径,这样呢,都在下边可以找到来添加错误的细节,现在把异常信息1EXCEPTION放进去,然后呢,添加错误的路径来看一下啊,添加那个路径,它的那个方法是掉到哪了,还能添加一个路径,那在这。
22:16
获取基本的错误信息,它在这呢,还能添加路径,相当也能放pass,其实也就是页面里边,那到底能取哪些,最终我们返回到这个错误页面,我们能取到哪些值,其实都是来参照deat error attributes的比,就说如果我们觉得错误页面里边取得这些值不够,我们就需要自定义它,如果我们觉得我们的跳转逻辑不想让它响应的这个白页是这个,杰森是那个,那我们就应该定义它,如果我们觉得我们不想把这个错误页面放在error文件夹下,我们就该定义它。所以呢,什么时候该定义哪个组件,那我们相当于就分析清楚了。所以以后呢,相当于我们想要自定义一些错误信息,那无外乎就是这么几种,诶,我们要不然自定义它,改变默认规则,要不然自定义它改变我们这个默认的错误路径,要么不然自定义它来改变一下默认错误里边能取到哪些信息,当然我们spring mvc里边以前用到的那错误处理机制,我们还能用。
23:17
当然呢,这几个是最底层的基本组件,那下节课呢,我们就把这么几个组件,我们全部呢,根据异常解析的流程,我们串起来看哪些组件什么时候来进行工作。
我来说两句