(6)Spring Boot 项目中异常处理老手是这样做的

154 阅读2分钟

在Spring Boot中,我们可以通过@ControllerAdvice@ExceptionHandler注解来实现全局异常处理。

@ControllerAdvice注解用于定义一个全局的异常处理类,我们可以在该类中定义多个@ExceptionHandler方法,用于处理不同类型的异常。这样,在系统发生异常时,Spring框架会自动调用相应的@ExceptionHandler方法来处理异常,返回处理后的结果给客户端

代码级别异常

代码级别异常通常是指由程序代码引起的异常,通常由程序逻辑错误、数据输入错误、空指针引用等引起。代码级别异常通常是我们在软件开发过程中最常遇到的异常。

代码级别异常通常可以通过编写代码来预防或处理。以下是一些常见的代码级别异常:

  • 空指针引用:当程序试图访问一个空对象的成员变量或者调用空对象的方法时,会发生空指针引用异常。
  • 数组越界:当程序试图访问数组中不存在的元素时,会发生数组越界异常。
  • 类型转换错误:当程序试图将一个不兼容的数据类型转换为另一种类型时,会发生类型转换异常。
  • 输入数据错误:当程序接收到非法的输入数据时,会发生输入数据异常,例如输入的字符串无法转换为数字或者日期格式等。
  • 文件访问错误:当程序试图访问不存在的文件或者试图对只读文件进行写入操作时,会发生文件访问异常。
@ControllerAdvice
@Slf4j
public class RestExceptionHandler {
​
    @ExceptionHandler(Exception.class)
    public <T> DataResult<T> exception(Exception e){
        log.error("exception:{}",e);
        return DataResult.fail(ResponseCode.SYSTEM_ERROR.getCode(),ResponseCode.SYSTEM_ERROR.getMessage());
    }
}
​

业务主动抛出异常

在业务开发过程中,有时候需要根据业务逻辑的处理结果来主动抛出异常。这样可以让上层调用者(例如控制层或服务层)捕获异常并进行相应的处理,从而避免业务逻辑的错误或者异常情况被忽略或者处理不当。

在下面码中,我们定义了一个BusinessException类,该类继承自RuntimeException,并在业务逻辑处理过程中,如果发生了业务异常,就通过throw语句抛出该自定义异常。

  • 自定义一个运行时异常:

    /**
     * 自定义的业务异常
     */
    public class BusinessException  extends RuntimeException{
        private final int code;
        private final String message;
    ​
        public BusinessException(int code, String message) {
            super(message);
            this.code = code;
            this.message = message;
        }
    ​
        public int getCode() {
            return code;
        }
    ​
        @Override
        public String getMessage() {
            return message;
        }
    }
    
  • RestExceptionHandler加入自定义异常监控

    /**
         * 自定义业务异常
         * @param e
         * @param <T>
         * @return
         */
        @ExceptionHandler(BusinessException.class)
        public <T> DataResult<T> businessException(BusinessException e){
            log.error("BusinessException:{}",e);
            return DataResult.fail(e.getCode(),e.getMessage());
        }
    
  • 业务代码主动throw异常

        @GetMapping("/test-business-erro")
        public String testBusinessException(@RequestParam  String type){
            // ... 业务逻辑处理过程
            if("发生了业务异常"){
                throw new BusinessException(ResponseCode.DATA_PARAM_ERROR.getCode(),ResponseCode.DATA_PARAM_ERROR.getMessage());
            }
            return type;
        }