这里看到新服务是封装的自定义异常,准备入手剖析一下,自定义的异常是如何进行抓住我们请求的方法的异常,并进行封装返回到。废话不多说,先看看如何才能实现封装异常,先来一个示例:
在这里,您会看到新服务是一个封装的自定义异常。 我准备分析它。 自定义异常如何捕获我们请求的方法的异常并将其封装回去。 让我们看看如何实现封装异常,让我们举个例子:
博主只做了简单的配置示例,主要的是进行源码剖析Springboot是如何获取自定义异常并进行返回的。来吧!
第一步:肯定是在Springboot启动的过程中进行的异常处理初始化,于是就找到了handlerExcep
tionResolver类,在创建该类的时候,会进行添加我们自定义异常。
最主要的初始化过程在这里,从这些代码中就可以看到为什么我们自定义异常需要进行使用@ControllerAdvice,并且方法使用@ExceptionHandler(Exception.class)注解了
找到类后,是如何找到方法的呢?主要看如何创建ExceptionHandlerMethodResolver的过程。
添加自定义异常的时候抛异常是在这里
好了。所有异常添加完毕了,我们来测试一下异常来的时候,Springboot是如何选择自定义异常并返回的,我们上面所有的操作都是在创建HandlerExceptionResolver时进行的,为什么要添加到HandlerExceptionResolver这里呢?看一下代码:
走完初始化,经过过滤器,***,我们的方法还报错了,所以会走到异常中,我们DispatcherServlet会进行抓住异常,然后回调用我们的processDispatchResult方法,大家可以自己看一下org/springframework/web/servlet/DispatcherServlet.java的源码,然后我们来分析一下这个方法都干啥了吧
那Springboot是如何选择哪一个是符合条件的自定义异常处理呢?如果我们定义了两个处理类,都对同一个异常进行捕获并返回不一样的信息咋办呢?看源码吧
逻辑基本是上面的,但是真正处理是否符合是在这里的一个方法中:
到这里基本如何写自定义异常、以及为什么这么写、底层做了哪些判断都已经讲解完了,自定义异常在工作中还是非常常用的一种手段,因为我们不可能暴露出我们内部的错误信息直接返回给用户,不仅用户体验不好,并且安全性也极其差。