温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

拦截器异常怎么处理

发布时间:2026-08-30 06:06:42 来源:亿速云 阅读:87 作者:小樊 栏目:编程语言

“拦截器异常怎么处理”这个问题比较通用,我先给你一个通用思路,再结合**常见框架(Spring、Vue/React、Axios)**给出具体做法。你可以对照使用。


一、通用处理思路(核心原则)

  1. 拦截器本身不要吞掉异常

    • 要么继续抛出
    • 要么包装成统一异常再抛出
  2. 区分异常类型

    • 业务异常(已知错误)
    • 系统异常(未知错误)
    • 网络 / 超时异常
  3. 统一返回结构

    • 无论成功还是失败,返回格式一致
    {
      "code": 500,
      "message": "系统异常",
      "data": null
    }
    
  4. 记录日志

    • 异常堆栈
    • 请求信息(URL、参数、用户)
  5. 兜底处理

    • 防止异常导致线程中断或页面崩溃

二、Spring / Spring Boot 拦截器异常处理

1️⃣ 拦截器中异常不建议直接 try-catch

❌ 不推荐:

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    try {
        check();
    } catch (Exception e) {
        return false;
    }
    return true;
}

✅ 推荐:抛异常 + 全局异常处理

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
    if (!check()) {
        throw new AuthException("未登录");
    }
    return true;
}

2️⃣ 使用 @ControllerAdvice 统一处理

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(AuthException.class)
    public Result<Void> handleAuth(AuthException e) {
        return Result.fail(401, e.getMessage());
    }

    @ExceptionHandler(Exception.class)
    public Result<Void> handleAll(Exception e) {
        log.error("系统异常", e);
        return Result.fail(500, "系统异常");
    }
}

3️⃣ 拦截器异常 vs 过滤器异常

组件 异常能否被 @ControllerAdvice 捕获
Filter ❌ 不能
Interceptor ✅ 可以
Controller ✅ 可以

拦截器异常 = 正常走 Spring 异常处理流程


三、前端拦截器异常(Axios 为例)

1️⃣ 请求拦截器异常

axios.interceptors.request.use(
  config => {
    // 可能抛异常
    config.headers.Authorization = getToken()
    return config
  },
  error => {
    // 请求拦截器异常
    return Promise.reject(error)
  }
)

⚠️ 不要吞掉异常


2️⃣ 响应拦截器异常处理(重点)

axios.interceptors.response.use(
  response => response,
  error => {
    if (!error.response) {
      // 网络异常
      console.error('网络异常', error)
      return Promise.reject(new Error('网络异常'))
    }

    const { status, data } = error.response

    if (status === 401) {
      // 跳登录
      router.push('/login')
    }

    return Promise.reject(data?.message || '未知错误')
  }
)

四、前端路由 / 请求拦截器通用建议

✅ 统一错误提示
✅ 避免重复弹窗
✅ 区分:

  • 401 → 登录失效
  • 403 → 无权限
  • 500 → 服务器异常
  • 网络错误 → 提示网络问题

五、常见坑总结

❌ 拦截器里 return false 但不返回错误
❌ 拦截器吞掉异常
❌ 前端没处理 error.responseundefined 的情况
❌ 拦截器里写大量业务逻辑

✅ 推荐:

  • 拦截器只做 校验 / 转换
  • 异常交给 统一异常处理机制

六、如果你愿意,我可以更精确回答

你可以补充:

  • ✅ 后端还是前端?
  • ✅ 用的什么框架?(Spring Boot / Vue / React / Axios / Gateway)
  • ✅ 是哪一类拦截器?(登录、权限、日志、请求参数)

我可以直接给你可复制的示例代码

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI