全局异常拦截以及拦截器转发异常 + 前端vue接收异常信息抛出异常

一、创建全局异常拦截类

package com.zx.framework.handler;

import com.zx.cargo.pojo.ResponseWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 全局异常处理
 */
@Slf4j
@RestControllerAdvice(
        basePackages = {
                "com.zx.cargo.stock.controller",
                "com.zx.cargo.code.controller"
        }
)
public class GlobalExceptionHandler {
    @ExceptionHandler({Throwable.class})
    public ResponseWrapper handleException(Throwable cause) {
        log.error("---start---全局异常-@see com.zx.framework.handler.HandlerException");
        System.out.println("cause--->"+cause.getMessage());
        cause.printStackTrace();
        log.error("---end---全局异常-@see com.zx.framework.handler.HandlerException");

        // 异常信息
        String message = cause.getMessage();
        if (StringUtils.isEmpty(message)) {
            message = "服务器内部错误!";
        }

        return new ResponseWrapper<Boolean, String>().failure().setMessage(message);
    }
}

了解 @ControllerAdvice

@ControllerAdvice是组件注解,他使得其实现类能够被classpath扫描自动发现,如果应用是通过MVC命令空间或MVC Java编程方式配置,那么该特性默认是自动开启的。

注解@ControllerAdvice的类可以拥有@ExceptionHandler, @InitBinder或 @ModelAttribute注解的方法,并且这些方法会被应用到控制器类层次的所有@RequestMapping方法上。

@ControllerAdvice会获取从Controller抛出的异常,只能获取从Controller抛出异常

二、拦截器转发异常信息

首先拦截器与过滤器 是在进入Controller层之前加载的,他们抛出的异常全局异常类拦截不到我们需要做一个异常信息的转发 获取到异常信息 将他抛出到Controller层

1.创建抛出异常的Controller

package com.zx.cargo.error.web;

import com.zx.cargo.pojo.GlobalException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;

/**
 * 全局过滤器 抛出异常 Controller
 */
@RequestMapping("/error")
@RestController
public class ErrorController {
    @RequestMapping("/exception")
    public void handleException(HttpServletRequest request) {
        throw new GlobalException(request.getAttribute("error").toString());
    }
}

2.在拦截器获取异常并重定向到异常Controller

try {
                     verify = JwtUtil.isVerify(token, user);
                } catch (ExpiredJwtException jwtExp) {
                    // 异常捕获,发送到error controller
                    request.setAttribute("error", "登录超时,请重新登录");
                    //将异常分发到/error/exthrow控制器
                    request.getRequestDispatcher("/error/exception").forward(request, response);
                }

前端vue进行配置

import {Loading, Message, MessageBox} from 'element-ui'

//响应回来token是否过期
Axios.interceptors.response.use(response => {
    if (response.data && response.data.status === false) {

      // 处理结果-未成功(skip为true跳过此处错误提示,在具体方法做处理)
      if (response.data.skip === false) {
        if (response.data.message) {
          Message.error(response.data.message)
        }
        return Promise.reject(response.data.message)
      }
    }
    return response

  },
  error => {
    return Promise.reject(error)
  })
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

国家级著名CV工程师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值