写前端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 做不同处理,比如提示重连网络,或者跳转到帮助页面。