简介
本文用实例介绍SpringBoot如何进行全局异常处理。
为什么要全局处理异常?
跟全局处理响应类似,后端抛异常时也要统一响应给前端。另外,全局处理异常还有如下优点:
- 减少代码量
- 如果不全局处理异常,那么需要自己去try catch,然后自己封装公共响应类。
- 便于维护、便于添加更多功能
- 添加全局异常处理后,可以在全局处理的地方做如下重要的处理:
- 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查看,请先登录
请先
!