• 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 处理

  • 相关阅读:
    基于xsh的vbs脚本的使用(语法)
    Markdown(1):markdown设置标题、插入代码、插入图片、配置vscode插件
    计算机组成原理---第三章存储系统---半导体随机存储器
    JAVA计算机毕业设计校园社团管理平台演示录像2021Mybatis+源码+数据库+lw文档+系统+调试部署
    【数据结构】【版本1.3】【线性时代】——栈
    Camunda 7.x 系列【51】运行时服务 RuntimeService
    Zookeeper 单机集群Windows和Linux部署搭建教程
    「洛谷 P3834」「模板」可持久化线段树 题解报告
    Word插件开发
    Linux docker(01) 基础操作
  • 原文地址:https://blog.csdn.net/weixin_62427168/article/details/126160718