前端请求后端接口时,可能会出现各种异常如:
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);
}
这样就通过异常处理器抛出自定义异常了!