springboot 全局处理异常

182 阅读3分钟

1.使用@RestControllerAdvice来处理全局异常

@RestControllerAdvice(annotations = RestController.class)
public class GlobalExceptionHandlerAdvice {
	/**
	 * 判断错误是否是已定义的已知错误,不是则由未知错误代替,同时记录在log中
	 * 
	 * @param e
	 * @return
	 */
	@ExceptionHandler(ServiceException.class)
        @ResponseBody
	public GeneralResult serviceException(ServiceException e, HttpServletRequest request, HandlerMethod handlerMethod) {

		GeneralResult generalResult = new GeneralResult();
		generalResult.setErrorCode(e.getErrorCode());
		generalResult.setErrorMessage(e.getMessage());
		generalResult.setStatus(false);

		return generalResult;
	}

	@ExceptionHandler(Exception.class)
        @ResponseBody
	public GeneralResult exception(Exception e, HttpServletRequest request, HandlerMethod handlerMethod) {

		GeneralResult generalResult = new GeneralResult();
		generalResult.setErr(ErrorCode.OPERATION_FAIL);
		return generalResult;
	}

}

2.错误码枚举类型

import lombok.AllArgsConstructor;
import lombok.Getter;

@AllArgsConstructor
@Getter
public enum ErrorCode
{
    OK("200", "请求成功"),
   CREATE_OBJECT_FAIL("11001","交易所对象实例化失败"),
   EXCHANGE_INIT_FAIL("11002","交易所初始化失败"),
   OPERATION_FAIL("11003","操作失败"),
   API_EXPIRED("11004","api无效"),
   NOT_SUPPORT_CHANGE_LEVER("11005","不支持修改杠杆倍数"),
   
   NOT_SUPPORT_QUERY_POSITION("11006","不支持查询仓位"),
   NOT_SUPPORT_QUERY_LEVER("11007","不支持查询杠杆倍数"),
   
   INVALID_REQ_PARAMS("11500", "请求参数不合法"),
   LIMIT_PARAMS_ERROR("11501","限价单请求参数错误"),
   MARKET_PARAMS_ERROR("11502","市价单请求参数错误"),
   LIMIT_SPOT_FOK_PARAM_ERROR("11503","止盈止损请求参数错误"),
   NOT_SUPPORT_TYPE("11504","不支持该类型参数"),
   PUBLIC_KEY_ERROR("11505","公钥错误"),
   INSUFFICIENT_BALANCE("11604","可用余额不足"),
   TRANSACTION_AMOUNT_IS_LESS_THAN_MINIMUM("11605","交易金额小于最小交易值"),
   PAIR_NOT_EXSIT("11607","交易对不存在"),
   ORDER_FAIL("11606","下单失败"),
   TOTAL_AMOUNT_SHOULD_THAN_ZERO("11608","下单数量必须大于零"),
   TRADE_PRICE_BIT_LIMIT ("11609","交易价格小数位数超过限制"),
   TRADE_AMOUNT_BIT_LIMIT("11610","交易数量小数位数超过限制"),
   ORDER_NOT_EXSIT("11611","订单不存在"),
   ORDER_CANCELING("11612","订单已撤销或者撤销中"),
   ORDER_FINISHED("11613","订单已完成交易"),
   QUERY_ORDER_FAIL("11614","查询订单失败"),
   NOT_SUPPORTED_TRIGGER("11614","不支持立即触发的订单"),
   CHANGE_LEVERAGE_FAIL("11615","修改杠杆倍数失败"),
   CANCEL_ORDER_FAIL("11617","撤单失败"),
   PALACE_ORDER_FAIL("11618","下单失败"),
   QUERY_UNFINISH_ORDER_FAIL("11619","查询委托单失败"),
   QUERY_HISTORY_ORDER_FAIL("11620","查询历史订单失败"),
   QUERY_POSITION_FAIL("11621","查询仓位失败"),
   QUERY_CONTACT_ACCOUNT_FAIL("11622","获取合约账户信息失败"),
   ORDER_PRECISION_ERROR("11623","下单精度不正确"),
   ORDER_VAULE_THAN_LESS_FIVE("11624","订单的名义价值不可以小于5"),
   ORDER_AMOUNT_THAN_MAX("11625","数量大于最大值"),
   ;
	
   private String code;
    
   private String msg;
    

}

3.返回值定义

public class GeneralResult
{
    // 结果状态, true 成功 false 失败
    private boolean status = true;
    
    // 如果错误则返回 错误代码
    private String errorCode;
    
    // 错误详情描述
    private String errorMessage;
    
    // 结果为true时的 业务数据,可为空
    private Object resultData;
    
    public GeneralResult(){
        this.errorCode = ErrorCode.OK.getCode();
        this.errorMessage = ErrorCode.OK.getMsg();
    }
    
    public GeneralResult(ErrorCode error){
        this.status = false;
        this.errorCode = error.getCode();
        this.errorMessage = error.getMsg();
    }
    
    public GeneralResult(ErrorCode error,Object obj){
        this.status = false;
        this.errorCode = error.getCode();
        this.errorMessage = error.getMsg();
        this.resultData = obj;
    }
    
    public GeneralResult(boolean status, String errorCode, String errorMessage)
    {
        super();
        this.status = status;
        this.errorCode = errorCode;
        this.errorMessage = errorMessage;
    }

    /**
     * 返回status属性
     * @return status属性
     */
    public boolean isStatus()
    {
        return status;
    }

    /**
     * 设置status属性
     * @param status status属性
     */
    public void setStatus(boolean status)
    {
        this.status = status;
    }

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errCode) {
        this.errorCode = errCode;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errMsg) {
        this.errorMessage= errMsg;
    }

    public Object getResultData() {
        return resultData;
    }

    public void setResultData(Object resultData) {
        this.resultData = resultData;
        this.status = true;
    }
    
    public void setErr(ErrorCode errCode) {
        this.errorCode = errCode.getCode();
        this.errorMessage = errCode.getMsg();
        this.status = false;
    }

}

4.自定义异常

@Getter
public class ServiceException extends RuntimeException {

	private static final long serialVersionUID = -6729902095681669366L;

	private String errorCode = "500";

	private String message;

	private Object errorData;

	public ServiceException(String errorCode, String message) {

		super(message);
		this.errorCode = errorCode;
		this.message = message;

	}

	public ServiceException(String errorCode, String message, Object errorData) {

		super(message);
		this.errorCode = errorCode;
		this.message = message;
		this.errorData = errorData;

	}

	public ServiceException(String message) {
		super(message);
		this.message = message;
	}

	public ServiceException(ErrorCode error) {
		this(error.getCode(), error.getMsg());
	}

}