在 javascript 的异步错误处理中,async 函数通过抛出异常(throw)来返回错误状态,调用方必须使用 try...catch 块或 .catch() 方法来捕获这些错误。具体做法是在 async 函数内部遇到错误时直接 throw 一个 error 对象,或者让被调用的 promise 拒绝(reject),这样 await 表达式就会抛出该错误,从而中断后续代码的执行并进入错误处理逻辑。

async 函数内部如何抛出错误
在 async 函数内部,你可以直接使用 throw 语句来抛出错误,这与同步代码中的行为一致。当你在 async 函数中使用 await 关键字等待一个 Promise 时,如果该 Promise 被拒绝,JavaScript 引擎会自动将拒绝原因转换为异常并抛出,此时无需手动捕获,只需在外层包裹 try...catch 即可。例如,如果 fetch 请求失败,await fetch(url) 会抛出 TypeError 或网络相关的错误,你可以直接在 catch 块中处理它。

async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Fetch failed:', error.message);
throw error; // 重新抛出以便上层处理
}
}
fetchData().then(data => console.log(data)).catch(err => console.log('Caught:', err));
Promise 拒绝如何转化为 async 函数的异常
当 async 函数内部调用的其他异步操作(如自定义 Promise 或第三方库函数)发生拒绝时,await 表达式会将这个拒绝自动转换为异常。这意味着你不需要在 async 函数内部手动检查 Promise 的状态,只要 await 后面的 Promise 被 reject,控制权就会立即跳转到最近的 catch 块。这种机制简化了错误处理流程,使得异步代码的错误处理看起来像同步代码一样直观。

function createRejectingPromise() {
return new Promise((resolve, reject) => {
setTimeout(() => reject(new Error('Simulated failure')), 1000);
});
}
async function handleRejection() {
try {
await createRejectingPromise();
console.log('This will not be printed');
} catch (error) {
console.log('Error caught:', error.message); // Output: Error caught: Simulated failure
}
}
handleRejection();
基于 await 表达式的错误传播机制
在上面的程序中,await 表达式是错误传播的核心。当 createRejectingPromise() 被拒绝时,await 关键字会暂停当前 async 函数的执行,并将拒绝原因作为异常抛出。这导致程序流跳过 console.log('This will not be printed'),直接进入 catch 块。这种机制确保了错误不会静默丢失,而是沿着调用栈向上冒泡,直到被某个 try...catch 捕获或由全局未捕获处理器处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











