在 then 中处理 promise 错误,最直接且推荐的做法是在链式调用的末尾添加一个 .catch() 方法。如果需要在特定的 then 回调内部捕获前一步的异常,可以在该回调函数体中使用 try...catch 语句包裹异步逻辑或同步代码。这两种方式都能有效防止未处理的 promise 拒绝(unhandled rejection)导致程序崩溃。

使用 .catch() 进行链式错误捕获
当 Promise 链中的任何环节抛出错误或返回被拒绝的 Promise 时,控制权会立即跳转到最近的 .catch() 处理器。这是处理异步错误的标准模式,因为它能统一收集来自多个异步操作的错误,避免在每个步骤都编写冗长的错误检查逻辑。

const fetchData = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const error = true;
if (error) {
reject(new Error("Network Error"));
} else {
resolve({ data: "Success" });
}
}, 1000);
});
};
fetchData()
.then(result => {
console.log("Data received:", result);
return result.data;
})
.then(data => {
console.log("Processing data:", data);
// Simulate processing error
throw new Error("Processing Failed");
})
.catch(error => {
console.error("Caught error in chain:", error.message);
});
运行上述代码,控制台将输出:Data received: { data: 'Success' }Caught error in chain: Processing Failed
注意,第二个 then 中的打印语句不会执行,因为错误被 catch 拦截了。
在 then 回调内部使用 try...catch
虽然 .catch() 是链式调用的最佳实践,但在某些特定场景下,你可能需要在单个 then 回调内部处理错误。这通常发生在你需要对错误进行局部处理,或者需要区分不同来源的错误时。通过在回调函数内部使用 try...catch,你可以捕获同步抛出的错误或由 await(如果在 async 函数中)引发的异步错误。

async function processWithLocalCatch() {
try {
const result = await fetchData();
console.log("Result:", result);
} catch (error) {
console.error("Local catch block:", error.message);
}
}
processWithLocalCatch();
运行此代码,控制台将输出:Local catch block: Network Error
这种方式将错误处理限制在当前作用域内,不会影响后续的链式调用(如果有的话),但需要注意的是,如果 fetchData 返回的是一个已经拒绝的 Promise 而不是抛出同步错误,try...catch 必须配合 await 才能捕获到它。如果不使用 await,则必须依赖 .catch()。
基于 Promise 链中错误传播的具体问题
在 Promise 链中,如果一个 then 回调没有显式返回一个新的 Promise 或值,而是让错误发生且未被 try...catch 捕获,错误会沿着链向后传递,直到遇到第一个 .catch()。如果链中没有 .catch(),错误将被视为未处理。理解这一传播机制对于调试复杂的异步流程至关重要。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











