详解SpringBoot异常处理流程及原理
详解SpringBoot异常处理流程及原理
异常处理流程
执行目标方法,目标方法运行期间有任何异常都会被catch
捕获,并标志当前请求结束,dispatchException
抛出异常
进入视图解析流程,并渲染页面,发生异常时,参数mv
为空,传入捕获的异常dispatchException
处理handler
发生的异常,处理完成返回ModelAndView
(1)遍历所有的HandlerExceptionResolvers
,找到可以处理当前异常的解析器来解析异常
(2)调用resolveException
解析异常,传入request
和response
对象,哪个方法,发生的异常,然后自定义异常处理返回ModelAndView
(3)系统默认的异常解析器
① DefaultErrorAttributes
先来处理异常,把异常信息保存到request
域并返回null
② ExceptionHandlerExceptionResolver
用来处理标注了@ExceptionHandler
注解的方法异常
③ ResponseStatusExceptionResolver
用来处理标注了@ResponseStatus
注解的方法异常
④ DefaultHandlerExceptionResolver
默认的处理器异常解析器,处理一些常见的异常
(4)如果没有任何解析器能够处理异常,异常就会抛出
(5)如果没有任何解析器能够处理当前异常,最终就会发送/error
请求,将保存的异常信息转发到/error
。BasicErrorController
专门来处理/error
请求,BasicErrorController
会遍历所有的ErrorViewResolver
解析错误视图,如果没有自定义的错误视图解析器,就会使用默认的DefaultErrorViewResolver
,会把响应码作为错误页的地址,模板引擎最终响应这个页面。
几种异常处理方式及原理
1.自定义错误页,error/404.html
、error/5xx.html
。有精确的错误状态码页面就匹配精确,没有就找 4xx.html
,如果都没有就触发白页
2.使用@ControllerAdvice
和@ExceptionHandler
处理全局异常,底层是ExceptionHandlerExceptionResolver
支持的
3.使用@ResponseStatus
和自定义异常。底层是 ResponseStatusExceptionResolver
,底层调用 response.sendError(statusCode, resolvedReason)
,Tomcat会收到一个error
。请求最后new
一个空的ModelAndView
返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error
请求,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
页面
4.Spring底层的异常,如参数类型转换异常。底层是DefaultHandlerExceptionResolver
处理框架底层的异常,底层也是response.sendError(HttpServletResponse.SC_NOT_ACCEPTABLE)
,Tomcat会收到一个error
。请求最后new
一个空的ModelAndView
返回,这样任何处理解析器都处理不了当前的异常,最终就会发送/error
请求,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
页面
protected ModelAndView doResolveException( HttpServletRequest request, HttpServletResponse response, @Nullable Object handler, Exception ex) { try { if (ex instanceof HttpRequestMethodNotSupportedException) { return handleHttpRequestMethodNotSupported( (HttpRequestMethodNotSupportedException) ex, request, response, handler); } else if (ex instanceof HttpMediaTypeNotSupportedException) { return handleHttpMediaTypeNotSupported( (HttpMediaTypeNotSupportedException) ex, request, response, handler); } else if (ex instanceof HttpMediaTypeNotAcceptableException) { return handleHttpMediaTypeNotAcceptable( (HttpMediaTypeNotAcceptableException) ex, request, response, handler); } else if (ex instanceof MissingPathVariableException) { return handleMissingPathVariable( (MissingPathVariableException) ex, request, response, handler); } else if (ex instanceof MissingServletRequestParameterException) { return handleMissingServletRequestParameter( (MissingServletRequestParameterException) ex, request, response, handler); } else if (ex instanceof ServletRequestBindingException) { return handleServletRequestBindingException( (ServletRequestBindingException) ex, request, response, handler); } else if (ex instanceof ConversionNotSupportedException) { return handleConversionNotSupported( (ConversionNotSupportedException) ex, request, response, handler); } else if (ex instanceof TypeMismatchException) { return handleTypeMismatch( (TypeMismatchException) ex, request, response, handler); } else if (ex instanceof HttpMessageNotReadableException) { return handleHttpMessageNotReadable( (HttpMessageNotReadableException) ex, request, response, handler); } else if (ex instanceof HttpMessageNotWritableException) { return handleHttpMessageNotWritable( (HttpMessageNotWritableException) ex, request, response, handler); } else if (ex instanceof MethodArgumentNotValidException) { return handleMethodArgumentNotValidException( (MethodArgumentNotValidException) ex, request, response, handler); } else if (ex instanceof MissingServletRequestPartException) { return handleMissingServletRequestPartException( (MissingServletRequestPartException) ex, request, response, handler); } else if (ex instanceof BindException) { return handleBindException((BindException) ex, request, response, handler); } else if (ex instanceof NoHandlerFoundException) { return handleNoHandlerFoundException( (NoHandlerFoundException) ex, request, response, handler); } else if (ex instanceof AsyncRequestTimeoutException) { return handleAsyncRequestTimeoutException( (AsyncRequestTimeoutException) ex, request, response, handler); } } catch (Exception handlerEx) { if (logger.isWarnEnabled()) { logger.warn("Failure while trying to resolve exception [" + ex.getClass().getName() + "]", handlerEx); } } return null; }
5.自定义实现 HandlerExceptionResolver
处理异常,可以作为默认的全局异常处理规则
@Order(value = Ordered.HIGHEST_PRECEDENCE) @Component public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { try { response.sendError(521,"I love you !"); } catch (IOException e) { e.printStackTrace(); } return new ModelAndView(); } }
ErrorViewResolver
实现自定义处理异常。
(1)底层调用response.sendError
时 ,error
请求就会默认转给basicErrorController
,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
页面
(2)如果异常没有任何解析器能处理,tomcat底层 也会调用response.sendError
。error
请求就会默认转给basicErrorController
,BasicErrorController
专门来处理/error
请求,适配4xx.html
或者5xx.html
页面。
(3)basicErrorController
要去的页面地址是由 ErrorViewResolver
这个错误视图解析器决定的,即适配4xx.html
或者5xx.html
页面。
到此这篇关于详解SpringBoot异常处理流程及原理的文章就介绍到这了,更多相关SpringBoot异常处理流程及原理内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
-
洗衣机不脱水了是怎么回事(洗衣机不甩干的处理方法)
洗衣机作为大家日常生活必备的家用电器,其利用率频繁,难免会因为机械磨损、缺乏润滑油、机件老化、弹簧疲劳变形等原因,出现各种不正...
-
电子表格零基础自学教程(小白也能学明白)
可能很多人(包括我)觉得Excel不就是做个表吗,没什么好学的。然而很多大型企业在面试的时候还是会问,“会Excel吗?”“会...
-
笔记本电脑报价大全(联想笔记本多少钱)
(注意:建议在旗舰店、官方旗舰店、官网购买) 一、游戏本设计本、办公本推荐如下: 华为品牌:(全球第一大电信设备商) 1...
-
煲机软件哪个好(让耳机有个思想准备)
《无间道》中陈永仁与刘建明有过一句经典对白——“高音甜、中音准、低音沉,总之一个词通透”。这一句话也一...
-
viewsonic平板电脑(viewsonic平板电脑刷机)
ViewSonic是一个视讯品牌,中文名字:优派。 ViewSonic 一、读音:英[vju:][?s?n?k],美[vj...
-
采访麦克风户外哪款好(讯飞智能无线麦克风C1采访神器)
对于视频创作者、直播工作者、远程培训老师、记者等媒体工作者来说,工作过程中,最让人费心的莫过于如何确保收音纯正、字幕快速生成、...
-
电脑硬件配置怎么查(详述两招快速查看电脑配置参数信息)
大家好,今天跟大家分享两个快速查看电脑配置参数信息的办法。 操作步骤如下: 1右击电脑屏幕最下方任务栏左侧的电脑徽标按钮,...
-
数据线没坏但充不上电怎么办(数据线充不上电处理方法)
苹果充电器突然充不上电是比较尴尬的问题,首先看自己的充电器数据线是不是原装,如果非原装在第一次充电时,苹果手机会提示你是否要适...
-
电脑开机出现黑屏如何处理(电脑不能开机黑屏解决方法)
电脑不能开机或者开机以后黑屏怎么解决?这里收集了所有常见的维修方法,看完秒变维修高手,实在是一篇不能错过的电脑维修教程。简单易...
-
手机宝典怎么搞(小米手机性能优化宝典)
别再总是抱怨手机卡顿,系统臃肿,反应慢,现在看完这篇文章,你会发现你并不了解小米手机,当然,文中许多方法并不是仅仅适用于小米手...