好用的异常处理工具

5 阅读1分钟
@Slf4j  
@RestControllerAdvice(annotations = {RestController.class})  
public class GlobalExceptionHandler {  
    @ExceptionHandler(AuthException.class)  
    public Result<?> authException(AuthException e) {  
    ResultCode rc = ResultCode.of(e.getCode());  
    return buildResult(rc == null ? ResultCode.AUTH_FAILED : rc, e);  
    }  
  
    @ExceptionHandler(BusinessException.class)  
    public Result<?> businessExceptionHandler(BusinessException e) {  
    return buildResult(e.getCode(), e.getMessage(), e);  
    }  
  
    @ExceptionHandler(MethodArgumentNotValidException.class)  
    public Result<?> validationBodyException(MethodArgumentNotValidException e) {  
        BindingResult result = e.getBindingResult();  
        String err = result.getFieldError() == null ? null : result.getFieldError().getDefaultMessage();  
        if (StringUtils.isBlank(err)) {  
        err = "参数错误,请检查后重试";  
        }  
        return buildResult(ResultCode.PARAM_ERROR, err, e);  
    }  
  
    @ExceptionHandler(BindException.class)  
    public Result<?> handleBindException(BindException e) {  
        String err = e.getFieldError() == null ? null : e.getFieldError().getDefaultMessage();  
        if (StringUtils.isBlank(err)) {  
        err = "参数错误,请检查后重试";  
        }  
        return buildResult(ResultCode.PARAM_ERROR, err, e);  
    }  

   @ExceptionHandler(IllegalArgumentException.class)  
    public Result<?> handleBindException(IllegalArgumentException e) {  
    return buildResult(ResultCode.PARAM_ERROR, e.getMessage(), e);  
   }  
  
    @ExceptionHandler(HttpMessageConversionException.class)  
    public Result<?> parameterTypeException(HttpMessageConversionException e) {  
        return buildResult(ResultCode.PARAM_ERROR, e);  
    }  
  
    @ExceptionHandler(MissingServletRequestParameterException.class)  
    public Result<?> missingServletRequestParameterException(MissingServletRequestParameterException e) {  
        return buildResult(ResultCode.PARAM_ERROR, "缺少必传参数:" + e.getParameterName(), null);  
    }  
  
    @ExceptionHandler(UnsupportedOperationException.class)  
    public Result<?> unsupportedOperationException(UnsupportedOperationException e) {  
        return buildResult(ResultCode.NOT_SUPPORTED, e.getMessage(), e);  
    }  

    @ExceptionHandler(Exception.class)  
    public Result<?> runtimeException(Exception e) {  
        return buildResult(ResultCode.FAIL, e);  
    }  
  
    private static Result<?> buildResult(ResultCode code, Throwable e) {  
        return buildResult(code, null, e);  
    }  

    private static Result<?> buildResult(ResultCode code, String msg, Throwable e) {  
        String s = StringUtils.isBlank(msg) || "null".equalsIgnoreCase(msg) ? code.getDesc() : msg;  
        return buildResult(code.getCode(), s, e);  
    }  

    private static Result<?> buildResult(int code, String msg, Throwable e) {  
        String debugMsg = ExceptionUtils.getErrorMsg(e);  
        if (code == ResultCode.FAIL.getCode()) {  
            log.error("服务处理异常, code:{}, msg:{}", code, msg, e);  
    } else {  
        log.warn("请求失败, code:{}, msg:{}, err:{}, exceptionClass:{}", code, msg, debugMsg, e.getClass().getCanonicalName(), e);  
        }  
        return Result.fail(code, msg).setDebug(debugMsg);  
        }  
    }