try..catch为什么不能捕获异步的错误
RT。 最近在学写爬虫。try...catch为什么不能捕获异步的错误?
15 回复
如楼上所说,我举个列子:
try {
console.log(1);
setTimeout(function(){
console.log(2);
throw new Error("This is a test error 2");
}, 1000);
console.log(3);
} catch(err) {
}
console.log(4);
执行这段代码,你会发现,Console.log会打印
1
3
4
2
你可以把 try {} catch(err) {} 这部分代码理解为函数f1,
setTimeOut里面定义的异步函数,要在f1执行完之后才会执行。
所以f1里面的catch是抓不到错误的。
- 阶段1:JS 代码开始运行时,不会马上启动事件循环,而是会依照 Run-to-completion 会从头到尾执行同步代码。
- 阶段2:同步代码执行完毕后,才会启动事件循环以监听事件。
try ... catch 作为同步代码的异常捕获语句,是在阶段 1 执行的。异步的错误,发生阶段 2。.
稍微一想,可知:已经执行完毕的 try ... catch 不可能捕获到在它执行完毕后所发生的错误。
异步,已经脱离了当前当前的主线程; 可以想象成在一个新的定时任务里去执行的; 只是能与主线程共享内存,堆栈等;
也可以想象成,你和你媳妇回家;你做火车,她做汽车; 目的都是回家。你没有堵车,顺利到家,她堵车了,她堵车但影响不到你的。
@yuelau 我在写爬虫,现在过程很简单用的uncaughtException捕获所有异常。网上搜这个问题的时候看到有demain这个东西,还不知道怎么用。先把功能做完,再补补node的异常处理这块。