如何在下层函数中捕获上层函数抛出的JavaScript异步错误
错误无法捕获的根本原因
try/catch只能捕获同步执行栈内抛出的异常,FetchSomeThing()是异步Promise接口,它的运行错误属于异步微任务错误,不在lowerFn的同步执行栈范围内,因此原生同步try/catch无法直接捕获。- 原代码中
upperFn没有返回内部的Promise对象,外部无法感知到异步任务的运行状态。 upperFn内部的.catch已经把错误消化处理,没有重新抛出的情况下,错误不会向上层传递。
修复方案
需要同时修改两个函数的实现:
- 让
upperFn返回内部的Promise对象,如果需要在内部先处理错误,处理完成后要重新抛出错误 lowerFn使用async/await语法等待异步任务执行,配合try/catch捕获异步错误
实现代码示例
// upperFn 调整 function upperFn(){ return FetchSomeThing() .catch(err => { // 可在此处先做upper层的通用错误处理 console.log('upperFn 捕获到原始错误:', err) // 重新抛出错误,才能传递到上层 throw err }) } // lowerFn 调整为async函数,配合await使用 async function lowerFn(){ try { await upperFn() } catch (err){ // 此处可正常捕获到错误 console.log('lowerFn 捕获到传递的错误:', err) } }
如果不需要在upperFn内提前处理错误,直接返回FetchSomeThing()即可,不需要写内部的.catch逻辑。
内容的提问来源于stack exchange,提问作者Laurent K
相关产品推荐
相关产品推荐

