知用网
柔彩主题三 · 更轻盈的阅读体验

Promise错误处理机制:让代码更稳的几种方式

发布时间:2025-12-11 16:46:50 阅读:4 次

写前端ref="/tag/131/" style="color:#C468A7;font-weight:bold;">代码时,异步操作几乎无处不在。比如安装一个软件包,后台要发请求、等响应、再更新界面。这个过程要是出错了,不能让页面直接卡住或者白屏吧?这时候就得靠 Promise 的错误处理机制来兜底。

用 catch 捕获错误最常见

最常见的写法就是在 Promise 链最后加一个 .catch()。只要前面任何一步 reject 了,都会被它接住。就像你下载安装包,网络断了或者文件损坏,都能提示用户“安装失败,请重试”。

fetch('/api/install-package')
  .then(response => response.json())
  .then(data => {
    console.log('安装成功', data);
  })
  .catch(error => {
    console.error('安装过程中出错:', error);
    alert('安装失败,请检查网络');
  });

async/await 怎么处理错误?

现在很多人喜欢用 async/await 写异步代码,看起来更像同步。但别忘了,它底层还是 Promise,出错一样得处理。这时候 try/catch 就派上用场了。

async function installSoftware() {
  try {
    const response = await fetch('/api/install-package');
    const data = await response.json();
    console.log('安装完成', data);
  } catch (error) {
    console.error('安装失败:', error);
    alert('软件安装出错,请稍后重试');
  }
}

这样写的好处是逻辑清晰,哪里可能出问题就包一层 try,不会因为一个小错导致整个流程崩掉。

别忘了 unhandledrejection

有些时候,Promise 出错了但没被 catch 到,浏览器会默默吞掉错误。这种情况在调试时很头疼。可以在全局监听 unhandledrejection 事件,把漏网之鱼打出来。

window.addEventListener('unhandledrejection', event => {
  console.warn('未捕获的 Promise 错误:', event.reason);
  // 可以上报到监控系统
});

这就像给所有安装流程加了个“保险”,哪怕某个环节忘了写 catch,至少还能在控制台看到问题。

reject 时尽量传详细信息

自己写 Promise 的时候,别随手 throw 个字符串。最好传个对象,带上错误码、类型、时间戳这些,方便后续处理。

return new Promise((resolve, reject) => {
  if (!hasNetwork()) {
    reject({
      code: 'NETWORK_ERROR',
      message: '网络不可用,无法开始安装',
      timestamp: Date.now()
    });
  }
});

这样外面 catch 到的时候,可以根据 code 做不同处理,比如提示重连网络,或者跳转到帮助页面。