java 全局异常处理实现

1.创建一个业务异常处理类

/**
 * 服务(业务)异常如“ 账号或密码错误 ”,该异常只做INFO级别的日志记录 @see WebMvcConfigurer
 */
public class ServiceException extends RuntimeException {
    private Code code;

    public ServiceException(Code code) {
        super(code.getMessage());
        this.code = code;
    }

    public ServiceException(Code code, String message) {
        super(message);
        this.code = code;
        this.code.setMessage(message);
    }

    public ServiceException(Code code, Throwable cause) {
        super(cause);
        this.code = code;
    }

    /**
     * 获取业务错误代码
     *
     * @return 业务错误代码
     */
    public Code getCode() {
        return code;
    }
}

 

2,定义全局异常拦截和处理类

/**
 * 全局异常处理
 *
 * Created by huhu
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    private static Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理业务异常
     *
     * @param request
     * @param ex
     * @return
     */
    @ExceptionHandler(ServiceException.class)
    public Result handleServiceException(HttpServletRequest request, ServiceException ex) {
        logger.info("service exception : {}", ex.getMessage());
        return ResultGenerator.genFailResult(ex.getCode(), ex.getMessage(), "");
    }

    /**
     * 处理文件上传异常
     *
     * @param request
     * @param e
     * @return
     */
    @ExceptionHandler(MultipartException.class)
    public Result handleMultipartException(HttpServletRequest request, MultipartException e) {

        if (e.getMessage().contains("the request was rejected because its size")) {
            logger.info("upload file error : {}", e.getMessage());
            return ResultGenerator.genFailResult(CommonCode.UPLOAD_FILE_ERROR);
        }

        logger.info("upload file error : {}", e.getMessage());
        return ResultGenerator.genFailResult(CommonCode.UPLOAD_FILE_ERROR);
    }

    /**
     * 捕获和处理 MethodArgumentNotValidException 方法参数无效的异常信息
     *
     * @param request 请求
     * @param e 异常
     * @return 返回异常信息状态码和异常信息
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result handleBindException(HttpServletRequest request, MethodArgumentNotValidException e) {
        logger.info("method argument not valid exception : ", e.getMessage());
        Map<String, String> data = e.getBindingResult().getFieldErrors().stream().collect(Collectors.toMap(FieldError::getField, FieldError::getDefaultMessage));
        return ResultGenerator.genFailResult(CommonCode.PARAMETER_ERROR, data);
    }

    /**
     * 处理 Exception 异常
     *
     * @param request
     * @param ex
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Result handleException(HttpServletRequest request, Exception ex) {
        ex.printStackTrace();
        handleLog(request, ex);
        String nowMessage = "Request method '" + request.getMethod() + "' not supported";
        if (ex.getMessage().equals(nowMessage)){
            logger.info("method error, please choose correct method!");
            return ResultGenerator.genFailResult(CommonCode.HTTP_METHOD_ERROR, ex.getMessage());
        }

        logger.info("server inernal error, please contact the administrator!");
        return ResultGenerator.genFailResult(CommonCode.SERVER_INERNAL_ERROR, ex.getMessage());
    }

    /**
     * 处理日志
     *
     * @param request
     * @param ex
     */
    private void handleLog(HttpServletRequest request, Exception ex) {
        StringBuffer logBuffer = new StringBuffer();
        logger.error(ex.getMessage());
        if (request != null) {
            logBuffer.append("  request method=" + request.getMethod());
            logBuffer.append("  url=" + request.getRequestURL());
            logBuffer.append("  params=" + request.getParameterMap());
        }
        if (ex != null) {
            logBuffer.append("  exception:" + ex);
        }
        logger.error(logBuffer.toString());
    }
}

 

全局异常处理主要是@RestControllerAdvice 注解和@ExceptionHandler(ServiceException.class)组合使用的结果,关于这两个注解可以百度一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值