一.自定义异常体系
1.背景
在业务代码的开发中,往往会有这种情况,代码逻辑走到某一步,通过if的判断发现程序的逻辑无法继续往下面走了,否则会有一定的问题,这时候我们需要抛出异常组织程序往下进行,快速响应这个请求,并且回滚事物,这就是我们的自定义异常体系.
2.设计
如何设计自定义异常体系,需要我们对自身系统的业务有一定的了解,例如一个商城,可能会有以下的自定义异常.
异常 | 场景 |
---|---|
OrderException.class | 订单业务发生异常 |
PayException.class | 支付业务发生异常 |
GoodsException.class | 商品业务发生异常 |
我们这里不做如何详细的异常体系设计,暂时只区分客户端异常,服务端异常.
(1)代码
CcmMallException.java
package com.ccm.common.exception;
/**
* @Description 自定义异常超类
* @Author ccm
* @CreateTime 2020/07/10 14:35
*/
public class CcmMallException extends RuntimeException {
}
CustomerException .java
package com.ccm.common.exception;
import lombok.Getter;
/**
* @Description 客户端异常
* @Author ccm
* @CreateTime 2020/7/10 14:40
*/
@Getter
public class CustomerException extends CcmMallException {
private CodeEnum codeEnum; //状态码
private String errorMessage; //错误详细信息
public CustomerException(String errorMessage) {
this.codeEnum = CodeEnum.ILLEGAL_REQUEST;
this.errorMessage = errorMessage;
}
public CustomerException(CodeEnum codeEnum, String errorMessage) {
this.codeEnum = codeEnum;
this.errorMessage = errorMessage;
}
}
ServerException.java
package com.ccm.common.exception;
import lombok.Getter;
/**
* @Description 服务端异常
* @Author ccm
* @CreateTime 2020/07/10 14:43
*/
@Getter
public class ServerException extends CcmMallException {
private CodeEnum codeEnum; //状态码
private String errorMessage; //错误详细信息
public ServerException(String errorMessage) {
this.codeEnum = CodeEnum.SYSTEM_INNER_ERROR;
this.errorMessage = errorMessage;
}
public ServerException(CodeEnum codeEnum, String errorMessage) {
this.codeEnum = codeEnum;
this.errorMessage = errorMessage;
}
}
二.统一结果集
1.common包里加入Reultset类,提供构造统一结果集的静态方法
package com.ccm.common.exception.result;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
/**
* @Description 统一结果集
* @Author ccm
* @CreateTime 2020/7/14 17:36
*/
@Slf4j
@Getter
@ToString
public class ResultSet<T> {
private Integer code; //状态码
private String codeMessage; //状态码信息
@Setter
private String errorMessage; //前后端对接错误信息
@Setter
private String errorMessageToUser; //给用户看的错误信息
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss:SSS",timezone = "GMT+8") //jackson指定时间转换格式
@JSONField(format="yyyy-MM-dd HH:mm:ss:SSS") //fastjson指定时间转换格式
private Date timestamp = new Date();
@Setter
private T data; //响应数据
//私有构造器
private ResultSet() {
}
//响应成功,无响应数据
public static ResultSet success() {
ResultSet resultSet = new ResultSet();
resultSet.code = CodeEnum.SUCCESS.getCode();
resultSet.codeMessage = CodeEnum.SUCCESS.getCodeMessage();
return resultSet;
}
//响应成功,有响应数据
public static <T> ResultSet<T> success(T data) {
ResultSet resultSet = new ResultSet();
resultSet.code = CodeEnum.SUCCESS.getCode();
resultSet.codeMessage = CodeEnum.