持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
为什么要精简返回给客户端的异常消息
如果我们不处理后端的异常消息,那每次返回给客户端的都是一长串的错误信息,不方便前端处理,也给用户非常不友好的使用体验。这时候就必须对错误信息进行精简处理,前端也不需要过于详细的后端报错信息。
封装自定义异常类
因为我们的项目是web项目,所以我们返回的异常消息必须都封装上状态码,所以我们还需要自定义异常类,用于异常消息的封装与返回。
自定义异常类,我选择继承RuntimeException。没有选择Exception,是因为Exception类型必须显示的处理,而RuntimeException会由虚拟机隐式处理。
创建自定义异常类
@Data
public class DomeException extends RuntimeException{
private String msg;
private int code = 500;
public DomeException(String msg) {
super(msg);
this.msg = msg;
}
public DomeException(String msg, Throwable e) {
super(msg, e);
this.msg = msg;
}
public DomeException(String msg, int code) {
super(msg);
this.msg = msg;
this.code = code;
}
public DomeException(String msg, int code, Throwable e) {
super(msg, e);
this.msg = msg;
this.code = code;
}
}
精简返回给客户端的异常消息
创建好自定义异常类以后,就可以编写异常消息拦截类。
@Slf4j
// 全局捕获spring mvc抛的异常
@RestControllerAdvice
public class ExceptionAdvice {
@ResponseBody
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
// 用来捕获指定的异常,这里是捕获所有异常
@ExceptionHandler(Exception.class)
public String validExceptionHandler(Exception e) {
log.error("执行异常",e);
// 捕获校验异常
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException exception = (MethodArgumentNotValidException) e;
//将错误信息返回给前台
return exception.getBindingResult().getFieldError().getDefaultMessage();
}
// 捕获自定义异常
else if(e instanceof DomeException){
EmosException exception=(EmosException)e;
return exception.getMsg();
}
// 捕获权限检验异常
else if(e instanceof UnauthorizedException){
return "你不具有相关权限";
}
else {
return "后端执行异常";
}
}
}
这个只是示例,可以在这个基础上扩张更多自己的异常处理方法。