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; }