【项目总结】秒杀系统学习の关于异常

前言

通过这个项目中学会了全局异常统一处理。之前,我对这一块含含糊糊,经过这次的学习,有了一个比较清晰的认识。说明:该项目是基于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);
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值