javascript复制下载fetch('/api/data')
.then(response => response.json())
.then(data => processData(data))
.catch(error => console.error('请求失败:', error));这种写法的好处是能捕获整个链条的错误,但要注意.catch()本身也会返回Promise,如果在这里面再抛出错误,就需要后续的.catch()来处理了。
第二种方法是给每个then()都配置错误回调。这种做法在需要区分处理不同阶段错误时特别有用:
javascript复制下载fetch('/api/data')
.then(
response => response.json(),
error => console.error('网络请求失败:', error)
)
.then(
data => processData(data),
error => console.error('数据解析失败:', error)
);不过这种方式会让代码显得有些冗长,而且如果某个环节忘记写错误处理,错误就会继续向下传递。
第三种是利用async/await配合try-catch,这是目前最受欢迎的写法。用同步的方式写异步代码,错误处理也变得直观:
javascript复制下载async function fetchData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
return processData(data);
} catch (error) {
console.error('操作失败:', error);
throw error; // 可以选择重新抛出
}
}这种写法的可读性很强,特别适合复杂的业务逻辑。但要注意async函数返回的也是Promise,调用时还是需要错误处理。
第四种方法可能很多人没注意过——给Promise构造函数设置错误回调。有些错误在Promise内部产生,但没被reject时,可以通过这个方式捕获:
javascript复制下载new Promise((resolve, reject) => {
asyncOperation((err, result) => {
if(err) reject(err);
else resolve(result);
});
// 其他可能抛出同步错误的地方
}).catch(error => console.error('Promise执行出错:', error));第五种是全局错误监听,作为最后的防线。在浏览器环境中可以监听unhandledrejection事件:
javascript复制下载window.addEventListener('unhandledrejection', event => {
console.error('未处理的Promise拒绝:', event.reason);
event.preventDefault(); // 阻止默认错误输出
});Node.js环境也有对应的process.on('unhandledRejection')。这种方式适合做错误上报和全局容错,但不能替代具体的错误处理。
实际开发中,这些方法往往需要组合使用。比如在async函数内部用try-catch处理可预期的业务错误,同时在全局设置unhandledrejection监听意料之外的错误。还要注意错误传播的特性——被捕获的错误不会继续向上抛出,除非在catch块中重新throw。
另外有个细节值得注意:Promise内部的同步错误会被自动捕获并转换为rejection,这和传统的回调函数不同。但如果在then()回调中抛出错误,就需要后面的catch()来接手了。
记住,没有哪种方法是万能的。简单的链式调用用.catch()就够了,复杂业务逻辑推荐async/await,关键是要保证错误处理覆盖所有可能出错的环节。良好的错误处理不仅能提升代码健壮性,在调试时也能省下不少时间。别看这些技巧简单,真正能玩转的没几个,希望大家在实践中多体会其中的门道。
987

被折叠的 条评论
为什么被折叠?



