谷粒学苑项目-第一章统一异常处理-1.8

一、统一异常处理的概念

我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理

二、创建统一异常处理器

1. 统一异常处理器

在service-base中创建统一异常处理类GlobalExceptionHandler.java。

/**
 * 统一异常处理类
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
  
}

2.异常的分类

异常一般分为三类:全局异常Exception,特定异常(如除数为0),自定义异常(业务异常)

3. 统一处理全局异常

/**
 * 统一异常处理类
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    //全局异常,系统自带的异常会自动抛出
    @ExceptionHandler(Exception.class)
    public Resault doException(Exception e){
        e.printStackTrace();
        return Resault.error().message("执行了全局异常");
    }
}

执行controller,触发异常

@ApiOperation("查找全部功能")
@GetMapping("/findall")
public Resault findAll(){
    List<EduTeacher> list = eduTeacherService.list();
    Integer.parseInt("100a");
    return Resault.ok().data("items",list);
}

自动抛出异常,并返回统一结果

{ "success": false, "code": 20001, "message": "执行了全局异常", "data": {} }

4. 统一处理特定异常

处理特定异常接口

/**
 * 统一异常处理类
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    //全局异常,系统自带的异常会自动抛出
    @ExceptionHandler(Exception.class)
    public Resault doException(Exception e){
        e.printStackTrace();
        return Resault.error().message("执行了全局异常");
    }

    //特定异常,如果是系统自带的会自动抛出
    @ExceptionHandler(NumberFormatException.class)
    public Resault doException(NumberFormatException e){
        e.printStackTrace();
        return Resault.error().message("执行了特定异常-NumberFormatException");
    }
}

执行controller,触发异常

@ApiOperation("查找全部功能")
@GetMapping("/findall")
public Resault findAll(){
    List<EduTeacher> list = eduTeacherService.list();
    Integer.parseInt("100a");
    return Resault.ok().data("items",list);
}

自动抛出异常,并返回统一结果

{ "success": false, "code": 20001, "message": "执行了特定异常-NumberFormatException", "data": {} }

5. 统一处理自定义异常

第一步:自定义异常类,继承自RuntimeException

@Data
@AllArgsConstructor
@NoArgsConstructor
public class BusinessException extends RuntimeException{
    private Integer code;
    private String msg;
}

第二步:处理自定义异常接口

/**
 * 统一异常处理类
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    //全局异常,系统自带的异常会自动抛出
    @ExceptionHandler(Exception.class)
    public Resault doException(Exception e){
        e.printStackTrace();
        return Resault.error().message("执行了全局异常");
    }

    //特定异常,如果是系统自带的会自动抛出
    @ExceptionHandler(NumberFormatException.class)
    public Resault doException(NumberFormatException e){
        e.printStackTrace();
        return Resault.error().message("执行了特定异常-NumberFormatException");
    }

    //自定义异常,系统不会自动抛出,需要自己throw new BusinessException
    @ExceptionHandler(BusinessException.class)
    public Resault doException(BusinessException e){
        e.printStackTrace();
        return Resault.error().code(e.getCode()).message(e.getMsg());
    }
}

第三步:执行controller,触发异常

@ApiOperation("查找全部功能")
@GetMapping("/findall")
public Resault findAll(){
    List<EduTeacher> list = eduTeacherService.list();
    try{
        Integer.parseInt("100a");
    }catch (Exception e){
        throw new BusinessException(20001,"执行了自定义异常");
    }

    return Resault.ok().data("items",list);
}

自动抛出异常,并返回统一结果

{ "success": false, "code": 20001, "message": "执行了自定义异常", "data": {} }
经验分享 程序员 微信小程序 职场和发展