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 的拦截器或封装的请求库中)确实可能出现“吞异常”的情况,这通常是由于拦截器未正确处理或抛出错误导致的。以下是常见原因和解决方案:
-
拦截器未抛出错误:在请求或响应拦截器中,如果遇到错误(如状态码非200),直接处理而未通过
reject或抛出异常,会导致上层调用无法捕获错误。- 解决:在拦截器中,确保错误被正确传递。例如,在响应拦截器中,检查
res.statusCode不为200时,使用Promise.reject(new Error(...))或throw new Error(...)抛出异常。
- 解决:在拦截器中,确保错误被正确传递。例如,在响应拦截器中,检查
-
全局错误处理缺失:如果拦截器内部静默处理了错误(如打印日志但未向上传递),调用方可能无法感知异常。
- 解决:在拦截器中统一错误处理逻辑,并确保错误能被上层
catch捕获。例如,封装请求函数时,在拦截器返回Promise.reject(error)。
- 解决:在拦截器中统一错误处理逻辑,并确保错误能被上层
-
异步操作未处理:拦截器中若包含异步操作(如Token刷新),可能未正确处理错误链。
- 解决:使用
async/await或Promise链确保异步错误被捕获并传递。例如,在请求拦截器中刷新Token失败时,直接reject错误。
- 解决:使用
-
示例代码修正:
假设使用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); } });

