区分同步错误和异步错误的核心在于判断代码执行是否跨越了 javascript 的事件循环(event loop)微任务或宏任务队列。同步错误发生在当前调用栈中,会立即中断程序并抛出异常;而异步错误通常发生在回调、promise 链或 async/await 之后,不会直接中断主线程,而是通过 promise 的 rejection 机制或 try-catch 块捕获。要准确处理这两类错误,开发者需要理解 `try-catch` 仅能捕获同步抛出的异常,对于异步操作必须使用 `.catch()` 方法或 `async/await` 配合 `try-catch`。

同步错误在 try-catch 中的表现
同步错误是指那些在当前执行上下文中立即发生的错误,例如除以零、访问未定义对象的属性或语法错误。这类错误会被 `try-catch` 语句直接捕获,因为它们的抛出和捕获发生在同一个调用栈帧内。如果不在 `try` 块中,同步错误会导致脚本停止执行。以下代码展示了如何捕获一个典型的同步错误:
function syncOperation() {
throw new Error('这是一个同步错误');
}
try {
syncOperation();
} catch (error) {
console.log('捕获到同步错误:', error.message);
}
运行上述代码,控制台将输出:`捕获到同步错误: 这是一个同步错误`。这表明 `try-catch` 成功拦截了同步抛出的异常,程序继续执行后续代码。这是处理同步错误的标准方式,无需额外配置。
异步错误在 Promise 中的表现
异步错误发生在事件循环的微任务或宏任务阶段,此时当前的 `try-catch` 块已经执行完毕,因此无法直接捕获。异步错误通常由 Promise 的 rejection 状态表示。处理异步错误需要使用 Promise 的 `.catch()` 方法,或者在 `async` 函数中使用 `try-catch`。以下代码演示了如何在 Promise 中捕获异步错误:
function asyncOperation() {
return new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('这是一个异步错误'));
}, 1000);
});
}
asyncOperation()
.then(result => console.log('结果:', result))
.catch(error => console.log('捕获到异步错误:', error.message));
运行上述代码,控制台将在 1 秒后输出:`捕获到异步错误: 这是一个异步错误`。这证明了异步错误不能通过常规的 `try-catch` 捕获,而必须通过 Promise 的错误处理机制来处理。如果使用 `async/await`,则可以将异步操作包裹在 `try-catch` 中,如下所示:
async function handleAsyncError() {
try {
await asyncOperation();
} catch (error) {
console.log('使用 async/await 捕获异步错误:', error.message);
}
}
这种写法使得异步错误的处理看起来与同步错误类似,但底层仍然是基于 Promise 的 rejection 机制。开发者应根据具体场景选择合适的方式处理异步错误,确保程序的健壮性。
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型

未处理的异步错误与全局捕获
当异步错误未被正确捕获时,它会成为未处理的 Promise 拒绝(Unhandled Rejection),可能导致程序行为异常或内存泄漏。浏览器和 Node.js 环境提供了全局事件来监听这些未处理的错误,以便进行统一处理或日志记录。以下代码展示了如何监听未处理的 Promise 拒绝:
window.addEventListener('unhandledrejection', event => {
console.log('未处理的 Promise 拒绝:', event.reason);
event.preventDefault(); // 防止默认行为
});
// 触发一个未处理的异步错误
Promise.reject(new Error('未处理的异步错误'));
运行上述代码,控制台将输出:`未处理的 Promise 拒绝: 未处理的异步错误`。这有助于开发者及时发现并修复潜在的异步错误问题。此外,Node.js 环境中也有类似的 `unhandledRejection` 事件,可以用于服务器端应用的错误监控。通过合理设置全局错误处理器,可以提升系统的稳定性和可维护性。

Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










