• SpringBoot-Web开发-异常处理


    目录

    一、默认规则

    二、自定义异常处理

    2.1  自定义错误页

    2.2 @ControllerAdvice+@ExceptionHandler处理全局异常

    2.3 @ResponseStatus+自定义异常

     三、异常处理的原理

    3.1 相关配置与组件

    3.2 异常处理流程


    一、默认规则

    • 默认情况下,Spring Boot提供/error处理所有错误的映射
    • 对于机器客户端,它将生成JSON响应,其中包含错误HTTP状态异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据

     

    二、自定义异常处理

    2.1  自定义错误页

            在template目录下创建error目录,里面创建错误页面,如 404.html5xx.html,springboot在遇到错误时会自动到error目录下匹配错误页面:

            有精确错误状态码页面就匹配精确;没有就模糊匹配,如 4xx.html;如果都没有就触发白页

    2.2 @ControllerAdvice+@ExceptionHandler处理全局异常

    1. @ControllerAdvice
    2. public class GlobalExceptionHandler {
    3. @ExceptionHandler({ArithmeticException.class,NullPointerException.class}) //处理异常
    4. public String handleArithException(Exception e){
    5. return "login"; //视图地址
    6. }
    7. }

             @Exceptionhandler注解内的参数是想要处理的异常类型

    2.3 @ResponseStatus+自定义异常

            在处理器方法内自定义一个异常:

    throw new userTooManyException();

            @ ResponseStatus 标注的

    1. @ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
    2. public class UserTooManyException extends RuntimeException {
    3. public UserTooManyException(){
    4. }
    5. public UserTooManyException(String message){
    6. super(message);
    7. }
    8. }

     三、异常处理的原理

    3.1 相关配置与组件

            ErrorMvcAutoConfiguration 自动配置异常处理规则

            组件:1. DefaultErrorAttributes定义错误页面中可以包含哪些数据

                       2. BasicErrorController 处理默认 /error 路径请求;期间产生一个 View(名字为error视图,即响应默认错误页),被BeanNameViewResolver视图解析器解析最终响应一个 ModelAndView。最后渲染错误页面(json/百页)

                       3. DefaultErrorViewResolver :如果发生错误,会以HTTP状态码作为视图页地址viewName),找到真正的页面,如error/404、5xx.html

    3.2 异常处理流程

            1、执行目标方法,目标方法运行期间有任何异常都会被catch、而且标志当前请求结束;并且用 dispatchException保存异常。

            2、进入视图解析流程

            processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);

             modelAndView由 processHandlerException产生:处理handler发生的异常,处理完成返回ModelAndView

             2.1 遍历所有的 handlerExceptionResolvers异常解析器,看谁能处理当前异常

            2.2 系统默认的异常解析器

                    2.2.1 DefaultErrorAttributes先来处理异常。把异常信息保存到request域,并且返回null

                    2.2.2 默认没有任何人能处理异常,所以异常会被抛出!!

                            1)若没有无法能处理,底层发送 /error 请求。交给BasicErrorController处理

                            2)遍历所有的 ErrorViewResolver 看谁能解析。

                            3)默认的 DefaultErrorViewResolver 响应状态码作为错误页的地址,转到error/4xx.html页面(没找到的话就输出百页)

                            4)模板引擎最终响应错误页面 

                    2.2.3 假如我们自定义了错误处理逻辑(非定义error页面),如:

                    处理全局异常,底层由ExceptionHandlerExceptionResolver支持。类似于处理正常的请求;

                    处理自定义异常底层由 ResponseStatusExceptionResolver支持,通过给Tomcat再次发送请求,请求/error

                    框架底层异常如参数类型转换异常:由DefaultHandlerExceptionResolver 处理

  • 相关阅读:
    OpenWrt环境下,由于wget不支持ssl/tls导致执行opkg update失败的解决方法
    生成 小程序 URL Scheme
    深入理解Python生成器和yield
    SimpleServletHandlerAdapter类简介说明
    Qt项目-安防监控系统(各个界面功能实现)
    RxJava(二)-转换操作符
    ADC实验
    蓝桥杯c++A组第二个填空题
    Postman自动化测试实战:使用脚本提升测试效率
    规则引擎基础知识
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126160718