SpringBoot统一异常处理以及自定义异常

前端请求后端接口时,可能会出现各种异常如:

1、java.lang.NullPointerException(空指针异常)

2、java.lang.ClassNotFoundException指定的类不存在

3、java.lang.NumberFormatException字符串转换为数字异常

4、java.lang.IndexOutOfBoundsException数组下标越界异常

等等……,这时返回前端的是直接的异常信息,导致前端很难看懂,所以我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。

首先我们要创建统一异常处理器

一、全局异常处理

/**
 * 统一异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result error(Exception e){
        e.printStackTrace();
        return Result.fail().message("执行了全局异常处理");
    }
}

 这样一来凡是出现了异常信息,就都会从统一异常处理类中返回相应的自定义异常信息。

二、特定异常处理

在统一异常处理类中重新写一个方法,方法上@ExceptionHandler注解内添加了 要捕获的异常类,所以如果代码出现了对应的异常信息时,就会找到这个方法来执行。

 /**
     * 空指针异常处理
     * @param e
     * @return
     */
    @ExceptionHandler(NullPointerException.class)
    public Result error(NullPointerException e){
        e.printStackTrace();
        return Result.fail().message("空指针异常!");
    }

如果代码出现了空指针异常,那么优先会找到这个异常处理。如果在统一异常处理类中没有标明空指针异常,则会执行全局异常处理的方法。

三、自定义异常

新建一个自定义异常类,同时这个类继承 RuntimeException,要在这个类里加上属性,如状态码、异常信息,

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

新建完自定义异常类后,需要到全局的异常处理器中将这个异常添加进去,如下:

    @ExceptionHandler(CustomizeException.class)
    @ResponseBody
    public Result error(CustomizeException e){
        e.printStackTrace();
        return Result.fail().message(e.getMsg()).code(e.getCode());
    }

这个自定义异常无法自动抛出,需要在使用时通过 try、catch

public Result get(@PathVariable Long id) {
        Teacher teacher = new Teacher();
        try {
            System.out.println(teacher.getName());
        }catch(Exception e) {
            throw new CustomizeException(20001,"出现自定义异常");
        }
        return Result.ok(teacher);
}

这样就通过异常处理器抛出自定义异常了!

你可能感兴趣的:(java,java,jvm,spring)