SpringBoot-Web开发-异常处理

本文介绍了SpringBoot的默认错误处理机制,包括如何显示JSON或浏览器友好的错误信息。接着,详细阐述了如何自定义错误页面,通过在template/error目录下创建相应状态码的HTML文件。此外,讲解了使用@ControllerAdvice和@ExceptionHandler进行全局异常处理,以及结合@ResponseStatus自定义异常类。最后,解析了SpringBoot异常处理的内部工作原理,涉及ErrorMvcAutoConfiguration、DefaultErrorAttributes和BasicErrorController等组件的交互过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、默认规则

二、自定义异常处理

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处理全局异常

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({ArithmeticException.class,NullPointerException.class})  //处理异常
    public String handleArithException(Exception e){
        return "login"; //视图地址
    }
}

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

2.3 @ResponseStatus+自定义异常

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

throw new userTooManyException();

        @ ResponseStatus 标注的

@ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException {

    public  UserTooManyException(){

    }
    public  UserTooManyException(String message){
        super(message);
    }
}

 三、异常处理的原理

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值