所有分类
  • 所有分类
  • 未分类

SpringBoot–全局异常处理

简介

本文用实例介绍SpringBoot如何进行全局异常处理。

为什么要全局处理异常?

跟全局处理响应类似,后端抛异常时也要统一响应给前端。另外,全局处理异常还有如下优点:

  1. 减少代码量
    • 如果不全局处理异常,那么需要自己去try catch,然后自己封装公共响应类。
  2. 便于维护、便于添加更多功能
    • 添加全局异常处理后,可以在全局处理的地方做如下重要的处理:
    • 1.统一将日志上传到ES等,便于排查问题。
    • 2.可以监控指定的异常信息,进行统一处理,比如:将异常信息邮件通知管理员

最终效果

Controller

package com.knife.example.business.product.controller;
 
import com.knife.example.business.product.vo.ProductVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Api(tags = "商品")
@RestController
@RequestMapping("product")
public class ProductController {

    @ApiOperation("查询详情")
    @GetMapping("detail")
    public ProductVO detail(Long id) {
        //省略查数据库等逻辑

        ProductVO productVO = new ProductVO();
        productVO.setId(1L);
        productVO.setName("鼠标");
        productVO.setStockQuantity(1200);

        int i = 1 / 0;

        return productVO;
    }
}

结果

方案简述

用两个注解来实现:@ControllerAdvice+@ExceptionHandler。这样可以捕获 Controller中抛出的指定类型异常,可对不同类型的异常单独进行处理。

多个异常处理类的执行顺序

如果有多个异常处理类(多个类都有@ControllerAdvice,且里边都有@ExceptionHandler),则会按顺序执行。可通过 @Order 来指定顺序。(实现Order接口或者使用@Primary都是不可以的)。

假设指定的顺序是:A=> B=> C ,如果B拦截并且处理了某个异常,就会直接抛出,C的异常处理器就执行不到了。

代码

此内容仅限VIP查看,请先
1

评论2

请先

  1. 你这样不是所有都会走第一个方法吗,第一个方法应该放最后吧
    史蒂夫v 2024-05-13 0
    • 不是,这里与顺序没关系,是先按最匹配的去执行,最后才到Exception这个兜底的。第一个方法放在开始与放在最后没有区别。
      自学精灵 2024-05-14 0
显示验证码
没有账号?注册  忘记密码?

社交账号快速登录