Spring Boot 统一异常处理


placeholder image
admin 发布于:2022-05-09 10:12:32
阅读:loading

基本介绍

正如Spring Boot 统一接口输出格式一样,对于系统的异常处理也需要站在全局的层面来封装异常的逻辑处理,本站的全局异常处理逻辑主要考虑以下几个层面:

(1)是否是用于提示或参数校验类型的异常逻辑,若是则不记录日志堆栈,将异常的描述信息返回至接口输出的结果中;

(2)是否是Ajax类型的请求类型,若是则响应结果为ErrorResult结构的JSON类型,供Ajax请求接收,否则若不为Ajax类型的请求则直接抛出异常,由底层系统的实现处理;

(3)是否为特殊类型的异常,即系统内置了一些类型的异常提示,若符合对应的异常类型则直接提示出对应的响应结果;

(4)若以上全不满足时,返回默认的异常提示处理,即获取当前异常堆栈的最里层错误信息直接响应给用户;

参考代码

/**
 * 全局异常处理
 * @param ex 异常对象
 * @param request request
 * @return 操作结果
 * @throws Exception 抛出异常
 */
@ExceptionHandler(Exception.class)
public BaseResult handerRestApiException(Exception ex , HttpServletRequest request) throws Exception {
    //提示类的异常不需要输出错误堆栈
    if(!(ex instanceof ValidateDataException)){
        log.error("操作发生了错误:" , ex);
    }
    //非ajax请求直接使用系统默认的异常出来,判断是否为ajax请求
    if(! Ajax.isAJAXRequest(request)) {
        throw ex;
    }
    ExceptionTypeEnum exceptionType = ExceptionTypeEnum.getExceptionType(ex.getClass().getSimpleName());
    if(exceptionType != null){
        return ErrorResult.build().message(exceptionType.getMessage());
    }
    String message = ExceptionUtils.getRootCauseMessage(ex);
    return ErrorResult.build().message(StringUtils.substring(message , message.indexOf(": ") + 1));
}

代码说明:以上的@ExceptionHandler修饰的方法声明位于ResponseBodyAdviceHandler中,不能单独存在于某个普通的@Component修饰的bean中;

/**
 * 全局异常验证管理
 * @author chendd
 * @date 2022/5/24 20:35
 */
@Controller
@RequestMapping("/exception")
@Api(value = "测试全局异常响应验证接口" , tags = {"全局异常响应验证"})
public class ExceptionController {

    @GetMapping("/ajax")
    @ApiOperation(value = "测试Ajax请求响应",notes = "测试响应结果集(<b>Swagger页面Ajax访问</b>)",
            consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    @ResponseBody
    public String intValue(){
        int result = 1/0;
        return null;
    }

    @GetMapping("/page")
    @ApiOperation(value = "测试http请求响应",notes = "测试响应结果集(<b>浏览器页面访问</b>)",
            consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
    public String stringValue(){
        throw new NullPointerException("自定义的异常输出");
    }

}

代码说明:上述类为测试抛出异常的验证类,提供了两个简单的测试方法,分别是Ajax请求(使用swagger请求)的错误输出和基于浏览器http访问的异常响应。

运行结果

image.png

(Ajax请求)

image.png

(http请求)

源码下载

源码工程下载可转至https://gitee.com/88911006/chendd-blog-examples项目的HandlerException分支;



 点赞


 发表评论

当前回复:作者

 评论列表


留言区