1. 通过 catch
捕获单个 Promise 错误
最常见的方式是通过 catch
方法捕获 Promise 中的错误。无论是 then
中的抛出的错误,还是异步操作失败,都会进入 catch
方法。
new Promise((resolve, reject) => {// 异步操作,可能抛出错误throw new Error("Something went wrong");
}).then(result => {console.log(result);}).catch(error => {console.error("Caught error:", error);});
在这里,无论何时 Promise 被 reject 或者抛出错误,catch
都会处理这个错误。
2. 通过 async/await
捕获错误
在使用 async/await
时,错误可以通过 try...catch
语法进行捕获。
async function myAsyncFunction() {try {const result = await somePromise();console.log(result);} catch (error) {console.error("Caught error:", error);}
}
在异步函数中,await
会让程序等待 Promise 结果,而 try...catch
可以捕获到异常。
3. 全局捕获未处理的 Promise 错误
如果有未处理的 Promise 错误(即没有 catch
),可以通过 window
对象监听 unhandledrejection
事件来捕获全局的未处理 Promise 错误。
window.addEventListener('unhandledrejection', function (event) {console.error("Unhandled promise rejection:", event.reason);
});
4. 使用 process.on
捕获全局 Promise 错误(Node.js 环境)
在 Node.js 中,可以使用 process.on
捕获未处理的 Promise 错误:
process.on('unhandledRejection', (reason, promise) => {console.error('Unhandled Rejection at:', promise, 'reason:', reason);// 这里可以进行日志记录、报警等操作
});
5. 全局捕获同步和异步错误
如果需要同时捕获同步错误和 Promise 错误,可以结合 window.onerror
和 unhandledrejection
事件。
// 捕获同步错误
window.onerror = function (message, source, lineno, colno, error) {console.error("Global error captured:", message, error);
};// 捕获未处理的 Promise 错误
window.addEventListener('unhandledrejection', function (event) {console.error("Unhandled promise rejection:", event.reason);
});
总结
- 单个 Promise 错误:使用
.catch
或try...catch
语法。 - 全局未处理 Promise 错误:浏览器环境使用
window.unhandledrejection
,Node.js 中使用process.on('unhandledRejection')
。