You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue中如何区分处理全局意外错误与Token刷新等预期业务异常

最优实现方案

你可以通过给已处理的预期错误添加自定义标记的方式解决该问题,无需调整现有处理逻辑层级,也不需要额外冗余代码,具体实现如下:

步骤1:修改axios响应拦截器

在跳转登录页后返回rejected Promise时,给错误对象添加handled标记,标识该错误已经完成业务处理,不需要上层再重复处理:

else {
  router.push({ name: 'auth-login' });
  const processedError = new Error("Unable to refresh token. Need login.");
  // 自定义标记:该错误已被处理
  processedError.handled = true;
  return Promise.reject(processedError);
}

步骤2:调整Vue全局错误处理器

在全局错误处理逻辑最前面增加判断,过滤掉所有带handled标记的已处理错误:

app.config.errorHandler = function (err, vm, info) {
  // 跳过已经手动处理完成的预期错误
  if (err?.handled) return;
  notyf.error(
    "Something went wrong. Please try again."
  );
}

方案优势

  • 完全符合错误就近处理原则:401相关的跳转逻辑依然保留在拦截器层,不需要上浮到全局处理器
  • 无冗余代码:上层所有接口调用不需要额外添加try catch捕获该类错误,开发效率不受影响
  • 符合全局错误处理器的设计定位:仅处理未被捕获的意外异常,预期错误不会触发全局提示
  • 扩展性强:后续其他类似的已处理预期错误(比如权限不足、参数校验失败等已经在业务层完成处理的场景),都可以通过添加同样的handled标记实现统一过滤

补充说明

你之前提到的方案3(中断错误传播)不推荐使用,强制中断Promise链路会导致上层等待的异步逻辑出现悬而未决的状态,可能引发内存泄漏或其他隐性bug,通过标记过滤的方式逻辑更清晰,风险更低。

内容的提问来源于stack exchange,提问作者Ale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 05:39:01