RT。 最近在学写爬虫。try…catch为什么不能捕获异步的错误?
因为现在没有错误
一般用法是 async/await + try catch 至于有错误捕获不到的问题,你还是在检查一下自己的代码吧
process.nextTick
执行产生的错误,当前不能捕获,时间点对不上
你的异步是做什么操作, http发送请求,有 on(‘error’)这样的监听方法,可以在这里捕获异常
try/catch从SPEC定义上就不会补货异步的错误
try {
//异步代码
} catch (err) {
}
try {} 这一块,直接执行到底部了,异步代码都没返回呢,怎么捕捉
如楼上所说,我举个列子:
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
不可能捕获到在它执行完毕后所发生的错误。
try…catch是同步代码,那我就明白了。很透彻,谢谢各位。
同步的思维写node就会有问题
异步,已经脱离了当前当前的主线程; 可以想象成在一个新的定时任务里去执行的; 只是能与主线程共享内存,堆栈等;
也可以想象成,你和你媳妇回家;你做火车,她做汽车; 目的都是回家。你没有堵车,顺利到家,她堵车了,她堵车但影响不到你的。
不过async await ; ts等好多插件是可以实现 获取异步 异常的;
@yuelau 我在写爬虫,现在过程很简单用的uncaughtException捕获所有异常。网上搜这个问题的时候看到有demain这个东西,还不知道怎么用。先把功能做完,再补补node的异常处理这块。
楼上好几位提到async/await,这需要引入babel暂时还不想弄,毕竟我ES6还没熟。目前co写起异步来已经很满意了
用promise的reject
来自酷炫的 CNodeMD