关于异步函数在外部try...catch块中捕获错误的正确性疑问
关于异步函数在外部try...catch块中捕获错误的正确性疑问
你完全没搞错!这个教程里的写法确实是错误的,你的理解才是正确的。
咱们来拆解一下问题所在:异步函数myFunction()调用后会立刻返回一个Promise对象,而外面的try...catch是同步执行的代码。当同步代码块执行完毕时,里面的异步操作(那些await的Promise)可能还没完成,后续Promise被拒绝抛出的错误,根本不在这个同步try...catch的捕获范围内——因为同步代码早就跑完了,错误是在之后的异步任务队列里触发的。
正确的错误捕获方式确实是你说的两种:
方式一:把
try...catch放在异步函数内部
直接在myFunction里用try...catch包裹所有await的操作,这样任何一个Promise被拒绝时,都会被内部的catch捕获:async function myFunction() { try { await someObject.methodThatReturnsPromise(); await aFunctionThatReturnsPromise(); } catch (e) { // 在这里处理异步操作的错误 console.error('出错了:', e); } } myFunction();方式二:在调用异步函数时处理错误
要么用await配合外部的try...catch(注意外部函数也得是异步的):async function runMyFunction() { try { await myFunction(); } catch (e) { console.error('捕获到错误:', e); } } runMyFunction();要么直接使用Promise的
.catch()方法,这也是你提到的写法:myFunction().catch((error) => console.error('捕获到错误:', error));
总结一下:同步的try...catch根本抓不到异步Promise的拒绝错误,必须通过异步函数内部的try...catch,或者调用异步函数时用await+外部try/catch,或者直接链式调用.catch()来处理。
备注:内容来源于stack exchange,提问作者geckels1
相关产品推荐
相关产品推荐

