提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


)


前言

学习保存代码用
自定义异常处理,在Controller中自定义发生的异常。


一、使用的注解

@ControllerAdvice
@ExceptionHandler
@ResponseBody

二、使用步骤

1.自定义基础异常类

/**
 * 自定义基础异常
 */
public class BaseException extends RuntimeException{
    private static final long serialVersionUID = 1L;

    /**
     * 所属模块
     */
    private String module;

    /**
     * 错误码
     */
    private String code;

    /**
     * 错误码对应的参数
     */
    private Object[] args;

    /**
     * 错误消息
     */
    private String defaultMessage;

    public BaseException(String module, String code, Object[] args, String defaultMessage)
    {
        this.module = module;
        this.code = code;
        this.args = args;
        this.defaultMessage = defaultMessage;
    }

    public BaseException(String module, String code, Object[] args)
    {
        this(module, code, args, null);
    }

    public BaseException(String module, String defaultMessage)
    {
        this(module, null, null, defaultMessage);
    }

    public BaseException(String code, Object[] args)
    {
        this(null, code, args, null);
    }

    public BaseException(String defaultMessage)
    {
        this(null, null, null, defaultMessage);
    }

    @Override
    public String getMessage()
    {
        String message = null;
        if (!StringUtil.isEmpty(code))
        {
            message = code;
        }
        if (message == null)
        {
            message = defaultMessage;
        }
        return message;
    }

    public String getModule()
    {
        return module;
    }

    public String getCode()
    {
        return code;
    }

    public Object[] getArgs()
    {
        return args;
    }

    public String getDefaultMessage()
    {
        return defaultMessage;
    }
}

各个模块继承基础异常模块(举例)

/**
 * 用户信息异常类
 */
public class UserException extends BaseException {
    private static final long serialVersionUID = 1L;

    public UserException(String code, Object[] args)
    {
        super("user", code, args, null);
    }
}

构建全局异常处理器

@ControllerAdvice
public class GlobalExceptionController {
    /**
     * 全局异常捕捉处理
     * @param e
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = Exception.class)
    public Map errorHandler(Exception e) {
        System.out.println("用户异常调用测!");
        Map map = new HashMap();
        map.put("code", 100);
        map.put("msg", e.getMessage());
        return map;
    }

    /**
     * 拦截捕捉自定义异常 用户删除异常
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = UserDeleteException.class)
    public AjaxResult UserDeleteException(UserDeleteException ex) {
        return AjaxResult.error(ex.getMessage());
    }

    /**
     * 拦截捕捉自定义异常 用户锁定异常
     * @param ex
     * @return
     */
    @ResponseBody
    @ExceptionHandler(value = UserBlockedException.class)
    public AjaxResult UserBlockedException(UserBlockedException ex) {
        System.out.println("用户锁定异常调用!");
        return AjaxResult.error(ex.getMessage());
    }
}

总结

错误类型的参数必须和@ExceptionHandler里的参数保持一致,否则会找不到解析器。返回图的话去掉@ResponseBody,返回类型设为ModelAndView

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐