当前端请求后端服务的时候,如果后端出现bug。会返回给前端通用的500异常结果。
但是在项目开发中,我们一般会定义一个统一结果类R用于返回结果数据,所以我们希望将错误也用统一结果类对象返回给前端。
1. 同一异常处理器。
面对一般的错误,我们可以设置一个同一异常处理器。代码如下:
@ComponentScan({"com.xxx.xxx","com.xxx.xxx.包名"})
public class UnifiedExceptionHandler {
//通用异常处理
@ExceptionHandler(value = Exception.class)
public R handleException(Exception e){
log.error(e.getMessage(),e);
return R.error();
}
}
2. 特定异常处理器。
首先,我们可以在结果响应枚举类中添加各种特点错误的结果码与描述信息:
public enum ResponseEnum {
SUCCESS(0,"成功"),
BAD_SQL_GRAMMAR_ERROR(-101, "sql语法错误"),
SERVLET_ERROR(-102, "servlet请求异常"), //-2xx 参数校验
UPLOAD_ERROR(-103, "文件上传错误"),
EXPORT_DATA_ERROR(104, "数据导出失败"),
//-2xx 参数校验
BORROW_AMOUNT_NULL_ERROR(-201, "借款额度不能为空"),
MOBILE_NULL_ERROR(-202, "手机号码不能为空"),
MOBILE_ERROR(-203, "手机号码不正确"),
PASSWORD_NULL_ERROR(204, "密码不能为空"),
CODE_NULL_ERROR(205, "验证码不能为空"),
CODE_ERROR(206, "验证码错误"),
MOBILE_EXIST_ERROR(207, "手机号已被注册"),
LOGIN_MOBILE_ERROR(208, "用户不存在"),
LOGIN_PASSWORD_ERROR(209, "密码错误"),
LOGIN_LOKED_ERROR(210, "用户被锁定"),
LOGIN_AUTH_ERROR(-211, "未登录"),
USER_BIND_IDCARD_EXIST_ERROR(-301, "身份证号码已绑定"),
USER_NO_BIND_ERROR(302, "用户未绑定"),
USER_NO_AMOUNT_ERROR(303, "用户信息未审核"),
USER_AMOUNT_LESS_ERROR(304, "您的借款额度不足"),
LEND_INVEST_ERROR(305, "当前状态无法投标"),
LEND_FULL_SCALE_ERROR(306, "已满标,无法投标"),
NOT_SUFFICIENT_FUNDS_ERROR(307, "余额不足"),
PAY_UNIFIEDORDER_ERROR(401, "统一下单错误"),
ALIYUN_RESPONSE_FAIL(-501, "阿里云响应失败"),
// 业务限流
ALIYUN_SMS_LIMIT_CONTROL_ERROR(-502, "短信发送过于频繁"),
// 其他失败
ALIYUN_SMS_ERROR(-503, "短信发送失败"),
WEIXIN_CALLBACK_PARAM_ERROR(-601, "回调参数不正确"),
WEIXIN_FETCH_ACCESSTOKEN_ERROR(-602, "获取access_token失败"),
WEIXIN_FETCH_USERINFO_ERROR(-603, "获取用户信息失败"),
ERROR(-1,"内部错误");
private Integer code;
private String message;
}
随后在上述的UnifiedExceptionHandler类添加相应的错误处理方法:
@ExceptionHandler(BadSqlGrammarException.class)
public R handleBadSqlGrammarException(BadSqlGrammarException e){
log.error(e.getMessage(), e);
return R.setResult(ResponseEnum.BAD_SQL_GRAMMAR_ERROR);
}