目录
当程序出现异常的时候,如果我们不加处理,或者直接抛出异常,那么相应给前端的就如下面这种提示信息,并且服务端控制台也会展示异常信息。非常不友好。
我们希望,程序即使报错,也要返回一个统一的异常结果。
一、全局异常处理
创建统一异常处理器
/**
* 统一异常处理类
*/
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Result error(Exception e){
e.printStackTrace();
return Result.error("执行了全局异常处理了");
}
}
这样程序抛出异常的时候,就会被该异常处理方法所捕获,并且返回统一异常处理的结果(JSON格式)!
二、处理特定异常
只需要在上述异常处理类中增加对应的方法
@ExceptionHandler(ArithmeticException.class)
@ResponseBody
public Result error(ArithmeticException e){
e.printStackTrace();
return Result.error("执行了特定异常处理(算术异常)");
}
当程序如果遇到@ExceptionHandler()注解所标注的异常之后,就会调用该方法抛出异常。
假如程序抛出的指定异常类型没有在统一异常处理类中指定,那么就会被其父类异常Exception.class所捕获。执行对应的全局异常方法。
三、自定义异常
我们也可以自定义编写一个异常类型,然后加入到统一异常处理类中,不过在业务中需要的位置,需要我们自己抛出。
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomException extends RuntimeException {
private Integer code;
private String msg;
}
try {
int a = 10/0;
}catch(Exception e) {
throw new CustomException(20001,"出现自定义异常");
}
@ExceptionHandler(CustomException.class)
@ResponseBody
public Result error(CustomException e){
return Result.error(e.getMsg(),e.getCode());
}
四、其他相关问题解答
若程序中还引入了其他有关异常处理的依赖包,可能导致我们写的全局异常处理不生效
这大概率是spring的bean优先级问题。
在Java中,Spring框架提供了一种强大的机制,允许我们通过使用@Order注解来控制Bean的初始化顺序。这个注解主要用于解决依赖注入的问题,特别是在处理复杂的依赖关系时。
@Order标记定义了组件的加载顺序,值越小拥有越高的优先级,可为负数。
例如:
@Order(-1)优先于@Order(0)
@Order(1)优先于@Order(2)
根据实际情况,我们只需要将@Order()注解作用在全局异常处理的类上或者指定的方法上或者属性上即可。