前言
通过这个项目中学会了全局异常统一处理。之前,我对这一块含含糊糊,经过这次的学习,有了一个比较清晰的认识。说明:该项目是基于ssm框架。
全局异常处理
1.Spring 统一异常处理有 3 种方式
分别为: 1.使用 @ ExceptionHandler 注解
2.实现 HandlerExceptionResolver 接口
3.使用 @controlleradvice +@ ExceptionHandler 注解(***)
2.方式3的步骤
1. 定义错误
2. 将错误映射成异常
3. 处理异常,然后让异常以自己需要的形式返回到前端。
3.实现
1.定义错误
public class CodeMsg {
private int code;
private String msg;
//通用异常
public static CodeMsg SUCEESS = new CodeMsg(0, "success");
public static CodeMsg SERVER_ERROR = new CodeMsg(500100, "服务端异常!");
public static CodeMsg BIND_ERROR = new CodeMsg(500101, "参数校验异常:%s!");
public static CodeMsg REQUEST_ILLEGAL = new CodeMsg(500102, "请求非法!");
public static CodeMsg ACCESS_LIMIT_REACHED = new CodeMsg(500103, "访问太频繁!");
public static CodeMsg LOGIN_ERROR = new CodeMsg(500104, "登陆异常!");
//登录模块 5002XX
public static CodeMsg SESSION_ERROR = new CodeMsg(500210, "Session不存在或者已经失效!");
public static CodeMsg PASSWORD_EMPTY = new CodeMsg(500211, "登录密码不能为空!");
public static CodeMsg MOBILE_EMPTY = new CodeMsg(500212, "手机号码不能为空!");
public static CodeMsg MOBILE_ERROR = new CodeMsg(500213, "手机号码格式错误!");
public static CodeMsg MOBILE_NOT_EXIST = new CodeMsg(500214, "用户不存在!");
public static CodeMsg PASSWORD_ERROR = new CodeMsg(500215, "密码错误!");
private CodeMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public CodeMsg fillArgs(Object... objects) {
int code = this.code;
String message = String.format(this.msg, objects);
return new CodeMsg(code, message);
}
}
定义错误也可以使用枚举
2.将错误映射成异常
public class GlobalException extends RuntimeException {
private CodeMsg codeMsg;
public GlobalException(CodeMsg codeMsg) {
super(codeMsg.getMsg());
this.codeMsg = codeMsg;
}
public CodeMsg getCodeMsg() {
return codeMsg;
}
}
3. 处理异常,然后让异常以自己需要的形式返回到前端。
抛出异常后,下面的GlobalExceptionHandler 类将处理类
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Result<String> exceptionHandler(HttpServletRequest request, Exception e) {
e.printStackTrace();
if (e instanceof GlobalException) {
GlobalException ex = (GlobalException) e;
return Result.error(ex.getCodeMsg());
} else if (e instanceof BindException) {
BindException ex = (BindException) e;
List<ObjectError> errors = ex.getAllErrors();
ObjectError error = errors.get(0);
String msg = error.getDefaultMessage();
return Result.error(CodeMsg.BIND_ERROR.fillArgs(msg));
} else {
return Result.error(CodeMsg.SERVER_ERROR);
}
}
}