异常处理类举例:
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;
}
}