无法修改源码时如何捕获函数内未返回的Promise拒绝异常
问题描述
现有一个main函数,内部创建了Promise实例但没有将该实例向外暴露/返回,代码如下:
function main() { var prom = new Promise(function(resolve, reject) { setTimeout(() => { console.log("testing"); reject(); }, 2000); }); return "success"; } main();
运行代码会触发Uncaught (in promise)类型的未捕获异常,导致JS执行中断,且完全无法修改main函数的源码,需要捕获该Promise的拒绝异常。
解决方法
由于内部创建的Promise实例没有暴露到外部作用域,你无法直接拿到该实例调用.catch()绑定错误处理,只能通过全局监听未处理Promise拒绝事件的方式捕获:
- 浏览器环境下,提前绑定
window上的unhandledrejection事件即可,注意监听代码要在调用main之前执行:
// 先绑定全局监听 window.addEventListener('unhandledrejection', (e) => { // 阻止默认的错误抛出行为,避免控制台报错、代码中断 e.preventDefault(); // 在这里写你的错误处理逻辑 console.log('已捕获Promise拒绝异常,错误原因:', e.reason); }); // 再调用main就不会触发未捕获错误 main();
- Node.js环境下,监听
process的unhandledRejection事件:
process.on('unhandledRejection', (reason) => { console.log('已捕获Promise拒绝异常,错误原因:', reason); }); main();
提示:全局监听会捕获当前环境下所有未手动添加
.catch处理的Promise拒绝事件,如果业务中有其他独立的Promise错误需要单独处理,请在回调中增加判断逻辑做过滤,避免误拦截。
内容的提问来源于stack exchange,提问作者pransin
相关产品推荐
相关产品推荐

