- 線上bug異常捕捉
- 背景:上線的時候發現一個bug,參數類型定義是一個Long型,但是前端傳遞過來的參數是一個undefined,導致解析失敗。但是查看日志打印只顯示類型轉換錯誤(MethodArgumentTypeMismatchException),也不清楚調的是哪個接口.於是調整了一下日志捕捉代碼。
private final static String ERROR_MSG = "服務器開小差啦!"; @ExceptionHandler(HttpRequestMethodNotSupportedException.class) public ResponseData<Object> methodNotSupportedHandler(HttpRequestMethodNotSupportedException e, HttpServletRequest request) { log.error("url:{} -> 請求方式不正確:{}", request == null ? null : request.getRequestURL(), e); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage()); } @ExceptionHandler(MissingServletRequestParameterException.class) public ResponseData<Object> paramErrorHandler(Exception e, HttpServletRequest request) { log.error("url:{} -> 參數異常:{}", request == null ? null : request.getRequestURL(), e); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage()); } @ExceptionHandler(MethodArgumentTypeMismatchException.class) public ResponseData<Object> mismatchErrorHandler(MethodArgumentTypeMismatchException e) { log.error("參數轉換失敗,方法:" + Objects.requireNonNull(e.getParameter().getMethod()).getName() + ",參數:" + e.getName() + ",信息:" + e.getLocalizedMessage()); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage()); } @ExceptionHandler(BusinessException.class) public ResponseData<Object> handler(BusinessException e, HttpServletRequest request) { log.error("url:{} -> 業務異常:{}", request == null ? null : request.getRequestURL(), e); Optional.ofNullable(request) .ifPresent(r -> { TreeMap<String, String> reqMap = new TreeMap<>(); for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) { String key = me.getKey(); String value = me.getValue()[0]; reqMap.put(key, value); } log.error("user:{},mate:{},入參:{}", UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap)); } ); return ResponseData.fail(e.getCode() == null ? ResponseCode.INTERNAL_ERROR.getCode() : e.getCode(), e.getMsg()); } @ExceptionHandler(ParamException.class) public ResponseData<Object> handler(ParamException e, HttpServletRequest request) { log.error("url:{} -> 參數異常:{}", request == null ? null : request.getRequestURL(), e); Optional.ofNullable(request) .ifPresent(r -> { TreeMap<String, String> reqMap = new TreeMap<>(); for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) { String key = me.getKey(); String value = me.getValue()[0]; reqMap.put(key, value); } log.error("user:{},mate:{},入參:{}", UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap)); } ); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMsg()); } /** * 配合Assert使用,香 * * @param e e * @param request request * @return object */ @ExceptionHandler({IllegalStateException.class, IllegalArgumentException.class}) public ResponseData<Object> handler(RuntimeException e, HttpServletRequest request) { log.error("url:{} -> 業務異常:{}", request == null ? null : request.getRequestURL(), e); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), e.getMessage()); } @ExceptionHandler public ResponseData<Object> handler(Exception e, HttpServletRequest request) { log.error("url:{} -> 錯誤:{}", request == null ? null : request.getRequestURL(), e); Optional.ofNullable(request) .ifPresent(r -> { TreeMap<String, String> reqMap = new TreeMap<>(); for (Map.Entry<String, String[]> me : r.getParameterMap().entrySet()) { String key = me.getKey(); String value = me.getValue()[0]; reqMap.put(key, value); } log.error("user:{},mate:{},入參:{}", UserContext.getUserId(), MateContext.getMate(), JSON.toJSONString(reqMap)); } ); return ResponseData.fail(ResponseCode.INTERNAL_ERROR.getCode(), ERROR_MSG); } /** * body參數 * * @param e BindException */ @ExceptionHandler(BindException.class) public ResponseData<Object> handlerBindException(BindException e) { StringBuilder msg = new StringBuilder(); FieldError c = e.getBindingResult().getFieldErrors().get(0); msg.append(c.getDefaultMessage()).append(":").append(c.getRejectedValue()); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString()); } /** * 方法參數 * * @param e ConstraintViolationException */ @ExceptionHandler(ConstraintViolationException.class) public ResponseData<Object> handlerConstraintViolationException(ConstraintViolationException e) { StringBuilder msg = new StringBuilder(); ConstraintViolation<?> violation = e.getConstraintViolations().iterator().next(); msg.append(violation.getMessage()).append(":").append(violation.getInvalidValue()); return ResponseData.fail(ResponseCode.PARAM_INVALIDATE.getCode(), msg.toString()); }