981377660LMT / ts

ts学习
6 stars 1 forks source link

为什么我没有catch到回调函数中抛出的错误? #627

Open 981377660LMT opened 3 weeks ago

981377660LMT commented 3 weeks ago

回调函数被异步调用时,外层try中的代码其实已经执行完了,栈帧已经从执行栈中弹出。当定时器时间到达时,执行引擎将回调函数压入一个空栈,也就是说回调函数处于执行栈的底部。如果这个回调函数没有catch住某个错误,那么这个错误就会泄露到全局。在node中,全局收到错误会造成进程的崩溃。

981377660LMT commented 3 weeks ago

错误的被抛出的时候是沿着执行栈向上找handler的。 运行时的执行栈结构,与程序员看到的“代码块结构”往往是不同的:用try语句包裹回调函数的定义,无法捕获到回调函数中的错误。 如果回调函数运行时没有外层函数,你必须在回调函数内部做错误的捕获和处理。

981377660LMT commented 3 weeks ago

注意try {fun();}无法捕获到错误,因为这个函数不是通过await来执行的。错误抛出的时候,这个try语句早已经执行完。