在 javascript 异步错误处理中,try-catch 无法直接捕获执行上下文(如 promise 或 async/await)中的错误,因为异步操作会跳出当前的同步调用栈。要捕获这些错误,必须将 try-catch 包裹在 await 表达式周围,或者使用 promise 的 .catch() 方法。对于 async 函数内部,await 后的代码若抛出异常,会被立即中断并传递给外层的 try-catch;而对于普通 promise,则需通过链式调用的 catch 分支来处理。

async/await 模式下如何捕获异步错误
当使用 async/await 语法时,只需将 await 关键字放在可能抛出错误的表达式前,并用 try-catch 包裹即可。这是因为 await 会暂停当前 async 函数的执行,直到 Promise 状态改变,如果 Promise 被拒绝(rejected),它会抛出一个异常,该异常会被同步的 try-catch 机制捕获。

async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error('Network response was not ok');
}
const data = await response.json();
console.log(data);
} catch (error) {
console.error('Caught an error:', error.message);
}
}
fetchData();
运行上述代码,如果网络请求失败或返回非 200 状态码,控制台将输出 Caught an error: Network response was not ok。这证明了在 async 函数内部,await 触发的拒绝状态可以被标准的 try-catch 结构正确拦截。
Promise 链式调用中如何处理拒绝状态
如果不使用 async/await,而是直接使用 Promise API,错误处理需要通过链式调用中的 .catch() 方法来实现。Promise 的拒绝状态不会触发同步的 try-catch,因此必须在 Promise 对象上挂载错误处理回调。这种方式适用于需要处理多个连续异步操作或在不支持 async/await 的环境中。

function fetchData() {
return fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Caught an error:', error.message);
});
}
fetchData();
执行这段代码,当 fetch 失败或中间步骤抛出错误时,控制流会跳过后续的 .then() 直接进入 .catch() 块,输出与 async/await 示例相同的错误信息。这表明 .catch() 是处理 Promise 拒绝的标准方式,其效果等同于 async 函数中的 try-catch。
未捕获的 Promise 拒绝会导致什么后果
如果在 Promise 链中遗漏了 .catch() 处理,或者在 async 函数中忘记用 try-catch 包裹 await,程序不会崩溃,但会触发全局的未捕获错误事件。在现代浏览器和 Node.js 环境中,这通常表现为控制台打印红色的警告信息,并可能触发 unhandledrejection 事件。这种静默失败或全局报错的行为不利于调试,因此必须确保所有异步路径都有对应的错误处理逻辑。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











