try..catch为什么不能捕获异步的错误
发布于 3 个月前 作者 ReakingAd 1193 次浏览 来自 问答

RT。 最近在学写爬虫。try…catch为什么不能捕获异步的错误?

17 回复

因为现在没有错误

一般用法是 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 不可能捕获到在它执行完毕后所发生的错误。

8楼说的很专业。 通俗的说: try .. catch 捕获同步代码错误,你的错误发生在异步,所以捕获不到。

try…catch是同步代码,那我就明白了。很透彻,谢谢各位。

同步的思维写node就会有问题

这个话题如果深入下去,怎么捕获异步错误呢? @ReakingAd ,你现在有答案了吗?

异步,已经脱离了当前当前的主线程; 可以想象成在一个新的定时任务里去执行的; 只是能与主线程共享内存,堆栈等;

也可以想象成,你和你媳妇回家;你做火车,她做汽车; 目的都是回家。你没有堵车,顺利到家,她堵车了,她堵车但影响不到你的。

不过async await ; ts等好多插件是可以实现 获取异步 异常的;

@yuelau 我在写爬虫,现在过程很简单用的uncaughtException捕获所有异常。网上搜这个问题的时候看到有demain这个东西,还不知道怎么用。先把功能做完,再补补node的异常处理这块。

楼上好几位提到async/await,这需要引入babel暂时还不想弄,毕竟我ES6还没熟。目前co写起异步来已经很满意了

用promise的reject

来自酷炫的 CNodeMD

回到顶部