uni-app 网络拦截器吞异常

uni-app 网络拦截器吞异常

2 回复

参考文档说明 https://uniapp.dcloud.net.cn/api/interceptor.html 这里涉及到拦截器

更多关于uni-app 网络拦截器吞异常的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在 uni-app 中,网络请求拦截器(通常指在 uni.request 的拦截器或封装的请求库中)确实可能出现“吞异常”的情况,这通常是由于拦截器未正确处理或抛出错误导致的。以下是常见原因和解决方案:

  1. 拦截器未抛出错误:在请求或响应拦截器中,如果遇到错误(如状态码非200),直接处理而未通过 reject 或抛出异常,会导致上层调用无法捕获错误。

    • 解决:在拦截器中,确保错误被正确传递。例如,在响应拦截器中,检查 res.statusCode 不为200时,使用 Promise.reject(new Error(...))throw new Error(...) 抛出异常。
  2. 全局错误处理缺失:如果拦截器内部静默处理了错误(如打印日志但未向上传递),调用方可能无法感知异常。

    • 解决:在拦截器中统一错误处理逻辑,并确保错误能被上层 catch 捕获。例如,封装请求函数时,在拦截器返回 Promise.reject(error)
  3. 异步操作未处理:拦截器中若包含异步操作(如Token刷新),可能未正确处理错误链。

    • 解决:使用 async/awaitPromise 链确保异步错误被捕获并传递。例如,在请求拦截器中刷新Token失败时,直接 reject 错误。
  4. 示例代码修正
    假设使用 uni.request 封装,以下为响应拦截器错误处理示例:

    uni.request({
      url: '...',
      success: (res) => {
        if (res.statusCode !== 200) {
          // 错误未被抛出,可能导致异常被“吞”
          // 修正:返回Promise.reject或触发统一错误处理
          return Promise.reject(new Error(`请求失败: ${res.statusCode}`));
        }
        return res.data;
      },
      fail: (error) => {
        // 网络错误等也需传递
        return Promise.reject(error);
      }
    });
回到顶部