无法捕获Async函数抛出的错误?技术问题咨询
为什么
foo的catch块没捕获到错误? 你写的代码里,waitAndMaybeReject是async函数,调用它会直接返回一个Promise对象——不管这个Promise最终是resolve还是reject,调用waitAndMaybeReject()这行代码本身不会同步抛出错误。
在foo的try块里,你只是直接return了这个Promise,没有用await去等待它的状态结果。这就意味着try块里的代码执行时完全没有同步异常,自然不会触发catch块。
要让catch块捕获到waitAndMaybeReject抛出的错误,你需要用await等待这个Promise完成:
async function waitAndMaybeReject() { await new Promise(r => setTimeout(r, 5000)); const isHeads = false; //const isHeads = true; if (isHeads) return 'yay'; throw Error('Boo!'); } async function foo() { try { // 加await等待Promise状态,拒绝时会抛出错误被catch捕获 return await waitAndMaybeReject(); } catch (e) { return 'caught'; } } foo();
核心逻辑:
- 直接return async函数的返回值,相当于把这个Promise原封不动地抛给
foo()的调用者,错误会由foo()返回的Promise的catch方法处理,而不是foo内部的catch块。 - 用
await后,async函数会暂停等待Promise完成,一旦Promise拒绝,await会把拒绝原因转换成同步错误,这时候try/catch就能捕获到。
内容的提问来源于stack exchange,提问作者A Singh
相关产品推荐
相关产品推荐

