springboot项目下基于slf4j的一种简单的全局异常捕获写法

首先,可以整一个返回类,该类可以用于所有接口的返回,不管是否请求成功。
如下:

public class Result<T> implements Serializable{
    private Integer code;//状态码
    private boolean flag;   //执行结果,true为执行成功 false为执行失败
    private String message; //返回结果信息,主要用于页面提示信息
    public T data;    //返回数据
    public Result() {
    } 
    public Result(boolean flag, String message, T data) {
        this.flag = flag;
        this.message = message;
        this.data = data;
    }
    public boolean isFlag() {
        return flag;
    }
    public void setFlag(boolean flag) {
        this.flag = flag;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }
     public Integer getCode() {
         return code;
     }
     public void setCode(Integer code) {
         this.code = code;
     }
 }

返回数据类型为T,是为了能插入不定类型数据。
异常捕获类,
注意三点:
1.@RestControllerAdvice,决定捕获哪个层面的异常。
2.@ExceptionHandler(RuntimeException.class),决定捕获哪些异常,括号里面可写多个异常类。
3.@ResponseBody返回方式
如下:

@RestControllerAdvice
public class NoPermissionExceptionHandler {
    public static final String DEFAULT_ERROR_VIEW = "error/error";
    private static final String logExceptionFormat
            = "Capture Exception By NoPermissionExceptionHandler: Code: %s Detail: %s";
    public static Logger logger = LoggerFactory.getLogger(NoPermissionExceptionHandler.class);
    /**
     *
     * 功能描述:全局异常处理
     * @Author 李
     * @MethodName handleException
     * @Date 10:30 2020/11/12
     * @param request
     * @param e
     * @return java.lang.Object
     * @exception
     **/
    @ExceptionHandler(RuntimeException.class)
    @ResponseBody
    public Object handleException(HttpServletRequest request, RuntimeException e){
        if(isAjax(request)){
            return ajaxException(e);
        }else {
            return otherException(e);
        }
    }
    /**
     *
     * 功能描述:判断是否ajax请求
     * @Author 李
     * @MethodName isAjax
     * @Date 10:18 2020/11/12
     * @param request
     * @return boolean
     * @exception
     **/
    private static boolean  isAjax(HttpServletRequest request) {
        return (request.getHeader("X-Requested-With") != null &&
                "XMLHttpRequest".equals(request.getHeader("X-Requested-With")));
    }
    /***
     *
     * 功能描述:ajax请求异常处理
     * @Author 李
     * @MethodName ajaxException
     * @Date 10:23 2020/11/12
     * @param e
     * @return acw.com.sys.config.Result
     * @exception
     **/
    private static <E> Result<E> ajaxException(RuntimeException e){
        Integer data = 0;
        String msg = "";
        if (e instanceof UnauthenticatedException){
            data = 10086;
            msg = "未登录或登录已过期";
        }else if(e instanceof UnauthorizedException){
            data = 95599;
            msg = "没有该权限";
        }else if (e instanceof IncorrectCredentialsException){
            data = 10010;
            msg = "用户名或密码错误";
        }else if (e instanceof MyShiroException){
            data = ((MyShiroException) e).getCode();
        }else if(e instanceof DisabledAccountException){
            data = 10010;
            msg = "用户被冻结";
        }else if(e instanceof MyException){
            data = ((MyException) e).getCode();
        }else{
            data = 666666;
            msg = "网络波动,请稍后再试"+e.getMessage();
        }
        return (Result<E>) exceptionFormat(data, e,msg);
    }
    /**
     *
     * 功能描述:非ajax请求异常
     * @Author 李
     * @MethodName otherException
     * @Date 10:26 2020/11/12
     * @param e
     * @return org.springframework.web.servlet.ModelAndView
     * @exception
     **/
    private static ModelAndView otherException(RuntimeException e){
        ModelAndView mv = new ModelAndView();
        if (e instanceof UnauthenticatedException){
            mv.addObject("massage","未登录或登录已过期");
        }else if(e instanceof UnauthorizedException){
            mv.addObject("massage","没有该权限");
        }else if (e instanceof IncorrectCredentialsException){
            mv.addObject("massage","用户名或密码错误");
        }else if (e instanceof MyShiroException){
            mv.addObject("massage",e.getMessage());
        }else if(e instanceof DisabledAccountException){
            mv.addObject("massage","用户被冻结");
        }else {
            mv.addObject("massage","网络波动,请稍后再试"+e.getMessage());
        }
        mv.setViewName(DEFAULT_ERROR_VIEW);
        logger.error(e.getMessage());
        return mv;
    }
    /**
     *
     * 功能描述:返回值前的泛型是参数T和E的
     * @Author 李培
     * @MethodName exceptionFormat
     * @Date 11:25 2020/12/29
     * @param data
     * @param ex
     * @param msg
     * @return acw.com.sys.config.Result
     * @exception
     **/
    private static <T extends Throwable,E> Result<E> exceptionFormat(E data, T ex , String msg) {
        Result<E> result = new Result<>();
        logger.error(String.format(logExceptionFormat, data, ex.getMessage()));
        result.setData(data);
        result.setMessage(StringUtils.isEmpty(msg)?ex.getMessage():msg);//有msg传msg,无msg传ex.getMessage()
        result.setFlag(false);
        return result;
    }
}

返回值前的泛型中,T和E可以理解为初始化定义,定义参数中的T和E。
捕获的异常,可以尽量写详细点,以便精确处理,虽然代码工的职责是写bug,但是bug多了也是会烦的。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值