1.自定义异常类
package com.zhx.common.exception; import com.zhx.common.model.ErrorCode; /** * @Author: SimonHu * @Date: 2019/8/23 13:59 * @Description:i自定义异常 */ public class CustomException extends RuntimeException { private String code; /** * @return * @Description:无参构造函数 * @Author:SimonHu * @Date: 2019/8/23 14:00 */ public CustomException() { super(); } /** * @param message * @return * @Description:用详细信息指定一个异常 * @Author:SimonHu * @Date: 2019/8/23 14:00 */ public CustomException(String message) { super(message); this.code = ErrorCode.ACCESS_ERROR.getCode(); } public CustomException(String code, String message) { super(message); this.code = code; } /** * @param message * @param cause * @return * @Description:用指定的详细信息和原因构造一个新的异常 * @Author:SimonHu * @Date: 2019/8/23 14:01 */ public CustomException(String message, Throwable cause) { super(message, cause); } /** * @param cause * @return * @Description:用指定原因构造一个新的异常 * @Author:SimonHu * @Date: 2019/8/23 14:01 */ public CustomException(Throwable cause) { super(cause); } public String getCode() { return code; } public void setCode(String code) { this.code = code; } }
2.枚举错误码
package com.zhx.common.model; /** * @Author: SimonHu * @Date: 2019/8/21 15:47 * @Description: */ public enum ErrorCode { ACCESS_ERROR("403", "访问被禁止"), BRADN_GOODS_INFO_ERROR("209", "查询不到品牌对应产品信息"), DECIPHER_FAIL("208", "解密失败"), BUSSINESSTYPE_NULL("207", "bussinessType不能为空"), REQUEST_ID_NULL("206", "requestId不能为空"), REQUEST_DOUBLE("205", "提交请求重复"), REQUEST_FAIL("204", "查询信息失败"), SIGN_ERROR("203", "签名错误"), PARAM_NOT_FULL("202", "请求参数不全"), SYS_ERROR("500", "系统错误"); ErrorCode(String code, String msg) { this.code = code; this.msg = msg; } public static String getCodeInfo(String code) { for (ErrorCode info : ErrorCode.values()) { if (code.equals(info.getCode())) { return info.getMsg(); } } return "其他错误"; } private String code; private String msg; @Override public String toString() { return "ErrorCodeEnum{" + "code=" + code + ", msg='" + msg + '\'' + '}'; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public static void main(String[] args) { System.out.println(ErrorCode.REQUEST_FAIL.getCode()); System.out.println(ErrorCode.REQUEST_FAIL.getMsg()); } }
3.全局异常捕获类
package com.zhx.common.config; import com.zhx.common.exception.CustomException; import com.zhx.common.model.ErrorCode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; /** * @Author: SimonHu * @Date: 2019/8/21 10:17 * @Description:全局异常捕获 */ @ControllerAdvice public class GlobalExceptionHandler { private Logger logger = LoggerFactory.getLogger(getClass().getName()); @ExceptionHandler(value = Exception.class) @ResponseBody public Result jsonHandler(HttpServletRequest request, Exception e) throws Exception { if ("org.apache.catalina.connector.ClientAbortException".equals(e.getClass().getName())) { logger.error("发生clientAbortException"); return null; } logger.error("-----------jsonHandler---错误信息----------:", e); return Result.error(ErrorCode.SYS_ERROR.getCode(),e.getMessage(), ""); } /** * @param request * @param e * @return com.zhx.common.Result * @Description:i自定义异常 * @Author:SimonHu * @Date: 2019/8/23 14:26 */ @ExceptionHandler(value = CustomException.class) @ResponseBody public Result customException(HttpServletRequest request, CustomException e) { logger.error("---------customException-----错误信息----------:"+e.getMessage()); logger.error(getErrrorInfo(e,e.getCode(),e.getMessage(),2)); return Result.error(e.getCode(), e.getMessage(), ""); } /** * @param ex * @param row 控制打印行数 * @return java.lang.String * @Description:获取错误信息并记录日志 * @Author:SimonHu * @Date: 2019/8/26 16:04 */ private String getErrrorInfo(Exception ex, String code, String msg,int row) { StringBuilder sb = new StringBuilder(); StackTraceElement[] error = ex.getStackTrace(); int i = 0; for (StackTraceElement stackTraceElement : error) { sb.append(stackTraceElement); sb.append("\r\n"); i++; if (i >= row) { break; } } return sb.toString(); } }
4.针对404和500错误信息我们需要添加两个配置:
#spring配置
spring:
mvc:
#出现错误时, 直接抛出异常
throw-exception-if-no-handler-found: true
resources:
#不要为我们工程中的资源文件建立映射
add-mappings: false
这样错误信息会以json格式返回,result我统一返回的500,实际这是个404错误。
5.抛出自定义异常信息
private String getEcardsGoodsIdByFacePrice(String brandId) { Map configMap = commonService.selectGateWayGoodsId(brandId); if(null==configMap||configMap.isEmpty()){ throw new CustomException(ErrorCode.BRADN_GOODS_INFO_ERROR.getCode(),brandId+ErrorCode.BRADN_GOODS_INFO_ERROR.getMsg()); } String str = String.valueOf(configMap.get("gateway_goods_id")); return str; }