springboot 自定义异常返回数据显示

 背景:

    由于在serviceImpl中处理数据业务逻辑时,有较多数据返回异常。通过HashMap或者是自定义dto返回异常给Controller,再处理给用户显示的话,步骤过于麻烦,因此,想着通过自定义ServiceException,用于直接抛出异常,在Controller中直接进行异常处理即可。

实现:

    ServiceImpl中直接抛出需要返回给用户看的数据,这边try catch 返回。

@RequestMapping(value = "/page",method = RequestMethod.POST)
    public ReturnVo page(@Validated MpUserPageDto mpUserPageDto) throws Exception {
        try{
            Page page = new Page<>(mpUserPageDto.getPageNum(),mpUserPageDto.getPageSize());
            return ReturnVo.success(mpUserService.selectPageExt(page, mpUserPageDto));
        }catch (ServiceException e){
            return ReturnVo.error(e.getReturnCodeEm());
        }catch (Exception e){
            e.printStackTrace();
            return ReturnVo.error(ReturnCodeEm.UNKNOWN_ERROR);
        }
        
    }

改进:

    由于上述实现看起来既不美观,又臃肿。遂创建自定义异常处理,对功能进行重新处理。

自定义异常处理:

/**
 * @Description 自定义异常处理类
 * @Author cao
 * @Date 2020/3/22 11:52
 * @Version 1.0
 */
@RestControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 方法参数校验异常
     */
    @ExceptionHandler(BindException.class)
    public ReturnVo handleBindException(BindException e) {
        return ReturnVo.error(ReturnCodeEm.PARAM_ERROR.getCode(),e.getBindingResult().getFieldError().getDefaultMessage());
    }

    /**
     * 处理自定义ServiceException
     */
    @ExceptionHandler(ServiceException.class)
    public ReturnVo handleServiceException(ServiceException e) {
        return ReturnVo.error(e.getReturnCodeEm());
    }

    /**
     * 处理未知异常,直接返回未知异常
     */
    @ExceptionHandler(Exception.class)
    public ReturnVo handleException(Exception e) {
        e.printStackTrace();
        return ReturnVo.error(ReturnCodeEm.UNKNOWN_ERROR);
    }

}

Controller 直接抛Exception,如果ServiceImpl中throws 自定义的ServiceException的话,会走自定义异常处理类中的handleServiceException,如果是其他未知的异常的话,会走自定义异常类中的handleException中:

    @RequestMapping(value = "/page",method = RequestMethod.POST)
    public ReturnVo page(@Validated MpUserPageDto mpUserPageDto) throws Exception {
        Page page = new Page<>(mpUserPageDto.getPageNum(),mpUserPageDto.getPageSize());
        return ReturnVo.success(mpUserService.selectPageExt(page, mpUserPageDto));
    }

 

你可能感兴趣的:(springboot)