SpringBoot 添加全局异常统一处理代码

首先提供一个自定义异常,使用已定义好的错误码枚举ResultCode,用来在代码中对可预知的异常进行抛出处理。

java 复制代码
package com.example.demo.exception;

import com.example.demo.result.ResultCode;
import lombok.Getter;

/**
 * 自定义异常
 * @auther wangbo
 * @date 2021-01-13 17:27
 */
@Getter
public class CustomException extends RuntimeException{

    private final ResultCode resultCode;

    public CustomException(ResultCode resultCode){
        super(resultCode.getMessage());
        this.resultCode = resultCode;
    }

}

接下来需要提供一个全局异常统一处理类,主要用到两个注解:@RestControllerAdvice@ExceptionHandler

java 复制代码
package com.example.demo.common.exception;

import com.example.demo.common.result.Result;
import com.example.demo.common.result.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ValidationException;

/**
 * 全局异常统一处理
 *
 * @author wangbo
 * @date 2021/05/12
 */
@Slf4j
@RestControllerAdvice
public class ExceptionHandlerAdvice {

    /**
     * 通用异常处理
     */
    @ExceptionHandler(Exception.class)
    public Result<Void> exceptionHandler(Exception e) {
        log.error("通用异常处理", e);
        return Result.failure(ResultCode.PROGRAM_INSIDE_EXCEPTION);
    }

    /**
     * 自定义异常处理
     */
    @ExceptionHandler(CustomException.class)
    public Result<Void> customExceptionHandler(CustomException e) {
        log.info("自定义异常处理");
        return Result.failure(e.getResultCode());
    }

    /**
     * 参数校验结果异常处理
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result<Void> methodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        log.info("参数校验结果异常处理");
        BindingResult bindingResult = e.getBindingResult();
        FieldError fieldError = bindingResult.getFieldError();
        assert fieldError != null;
        return Result.failure(fieldError.getField() + " : " + fieldError.getDefaultMessage());
    }

    /**
     * 参数校验过程异常处理
     */
    @ExceptionHandler(ValidationException.class)
    public Result<Void> validationExceptionHandler(ValidationException e) {
        log.error("参数校验过程异常处理", e);
        return Result.failure(ResultCode.PROGRAM_INSIDE_EXCEPTION);
    }

}

最后两个有关参数校验的异常处理在本文中并没有使用,是在接口参数校验中用到的。

使用示例,直接进行抛出,抛出的异常会在全局异常处理类中统一进行处理:

java 复制代码
@GetMapping("/list")
public List<User> list(){
    if (true){
    	//直接抛出异常,该自定义异常会被ExceptionHandlerAdvice类中的customExceptionHandler方法处理。
        throw new CustomException(ResultCode.REQUEST_PARAM_ERROR);
    }
    return userService.list();
}

这个接口会直接返回如下结果:

json 复制代码
{
    "code":50002,
    "message":"请求参数错误",
    "data":null
}
相关推荐
薛定谔的悦43 分钟前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
enjoy嚣士1 小时前
springboot之Exel工具类
java·spring boot·后端·easyexcel·excel工具类
无限大62 小时前
职场逻辑03:3步搞定高效汇报,让领导看到你的价值
后端
盐水冰2 小时前
【烘焙坊项目】后端搭建(12) - 订单状态定时处理,来单提醒和顾客催单
java·后端·学习
紫丁香3 小时前
AutoGen详解一
后端·python·flask
小涛不学习3 小时前
Spring Boot 详解(从入门到原理)
java·spring boot·后端
Victor3564 小时前
MongoDB(51)什么是分片?
后端
Victor3564 小时前
MongoDB(50)副本集中的角色有哪些?
后端
daidaidaiyu4 小时前
Spring IOC 源码学习 声明式事务的入口点
java·spring
IT_陈寒5 小时前
JavaScript开发者必看:5个让你的代码性能翻倍的隐藏技巧
前端·人工智能·后端