关于异常处理(1)

87 阅读2分钟

异常处理类举例:

package com.shuwen.production.manage.rest.exception;

import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.shuwen.magic.common.exception.ApiException;
import com.shuwen.magic.common.exception.BizException;
import com.shuwen.magic.errcode.enums.ErrCodeEnum;
import com.shuwen.production.manage.core.common.log.CommonLogger;
import com.shuwen.production.manage.core.common.log.LogTraceUtil;
import com.shuwen.production.manage.dto.Result;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * API异常统一处理
 *
 * @author gxp
 * @create 2019/5/20 下午3:50
 **/
@ControllerAdvice
@Slf4j
public class ApiExceptionHandler {

    /**
     * 统一处理业务异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = {BizException.class})
    @ResponseBody
    protected Object bizExceptionHandler2(BizException e) {
        Result result = Result.fail(e.getCode(), e.getMsg());
        result.setRequestId(LogTraceUtil.get().getTrace());
        CommonLogger.build().setName("api-error").setMessage("调用发生api异常").setDesc(JSONObject.toJSONString(e)).logger(log);
        LogTraceUtil.get().cleanTrace();
        return result;
    }

    @ResponseBody
    @ExceptionHandler(value = {Exception.class})
    protected Object systemExceptionHandler(Exception e) {
        Result result = Result.fail(ErrCodeEnum.FAILED_CODE.getCode(), "系统异常");
        result.setRequestId(LogTraceUtil.get().getTrace());
        CommonLogger.build().setName("api-error").setMessage("系统异常").setDesc(ExceptionUtils.getStackTrace(e)).logger(log);
        LogTraceUtil.get().cleanTrace();
        return result;
    }

    @ExceptionHandler(value = ApiException.class)
    @ResponseBody
    public Object exceptionHandler(ApiException e) {
        Result result = Result.fail(e.getCode(), e.getMsg());
        result.setRequestId(LogTraceUtil.get().getTrace());
        CommonLogger.build().setName("api-error").setMessage("调用发生api异常").setDesc(e.getMsg()).logger(log);
        LogTraceUtil.get().cleanTrace();
        return result;
    }

    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    protected Object handleConstraintViolation(MethodArgumentNotValidException e) {
        Result result = Result.fail(HttpStatus.BAD_REQUEST.toString(), e.getBindingResult().getFieldError().getDefaultMessage());
        result.setRequestId(LogTraceUtil.get().getTrace());
        LogTraceUtil.get().cleanTrace();
        return result;
    }

    @ExceptionHandler(value = JsonParseException.class)
    @ResponseBody
    protected Object jsonExceptionHandler(JsonParseException e) {
        Result result = Result.fail("-1", "解析请求体JSON格式错误");
        result.setRequestId(LogTraceUtil.get().getTrace());
        CommonLogger.build().setName("api-error").setMessage("调用发生api异常").setDesc(JSONObject.toJSONString(e)).logger(log);
        LogTraceUtil.get().cleanTrace();
        return result;
    }

    @ExceptionHandler(value = JsonProcessingException.class)
    @ResponseBody
    protected Object jsonExceptionHandler2(JsonProcessingException e) {
        Result result = Result.fail("-1", "解析请求体JSON格式错误");
        result.setRequestId(LogTraceUtil.get().getTrace());
        CommonLogger.build().setName("api-error").setMessage("调用发生api异常").setDesc(JSONObject.toJSONString(e)).logger(log);
        LogTraceUtil.get().cleanTrace();
        return result;
    }

}



package com.shuwen.magic.common.exception;

/**
 * 业务异常
 * @Author zhongchunyan
 * @Date 2020/5/22 10:35 上午
 * @Version 1.0
 */
public class BizException extends RuntimeException {

	private String code;
	private String msg;

	public BizException(String code, String msg) {
		this.code = code;
		this.msg = msg;
	}

	public BizException(String message, String code, String msg) {
		super(message);
		this.code = code;
		this.msg = msg;
	}

	public BizException(String message, Throwable cause, String code, String msg) {
		super(message, cause);
		this.code = code;
		this.msg = msg;
	}

	public BizException(Throwable cause, String code, String msg) {
		super(cause);
		this.code = code;
		this.msg = msg;
	}

	public BizException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace, String code, String msg) {
		super(message, cause, enableSuppression, writableStackTrace);
		this.code = code;
		this.msg = msg;
	}

	public String getCode() {
		return code;
	}

	public BizException setCode(String code) {
		this.code = code;
		return this;
	}

	public String getMsg() {
		return msg;
	}

	public BizException setMsg(String msg) {
		this.msg = msg;
		return this;
	}
}
package com.shuwen.magic.common.exception;


/**
 * API异常
 *
 * @author tengsimin
 * @create 2018/5/20 上午15:46
 **/
public class ApiException extends RuntimeException {

    private static final long serialVersionUID = 5524681570122303333L;

    private String code;
    private String msg;

    public ApiException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public static void throwException(String code, String msg) {
        throw new ApiException(code, msg);
    }

    /**
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * @param code the code to set
     */
    public void setCode(String code) {
        this.code = code;
    }

    /**
     * @return the msg
     */
    public String getMsg() {
        return msg;
    }

    /**
     * @param msg the msg to set
     */
    public void setMsg(String msg) {
        this.msg = msg;
    }


}