setTimeout 报错导致整个进程退出, 是正常行为吗
发布于 3 个月前 作者 jiyinyiyong 766 次浏览 来自 问答

在浏览器环境习惯了, 记不起来 Node.js 以前是不是这样. 我的想法是把一些逻辑放在 setTimeout 的事件队列当中执行, 这样代码报错了, 主进程不受到影响, 而报错是直接打印在 Console 里的. 可是实际测试了一下, setTimeout 当中代码报错, 整个 Node.js 进程直接退出了. 除了 try/catch 还有没有方式可以在 Node.js 当中模拟浏览器的行为? Node.js 当中一开始就这样吗?

示例代码:

var http = require('http');

http.createServer(function(req, res) {
  return a(2);
}).listen(3000);
3 回复

问题在于 setTimeout 里面设置的回调也是在主线程中被调用的啊,挂了并且没有进行异常捕获当然会让整个进程退出了

个人猜测: 1、settimeout 会把回调放到 micro queue 里,主进程是不断地从不同 queue 里取出回调执行,因此无论是哪类事件队列,出错都是被主进程抓到,浏览器也是 2、node 和 浏览器两者的应用场景决定了对于 settimeout 报错行为处理方式的不同,node 里是直接抛出,而浏览器里应该是主动抓住并抛出

如果要模拟浏览器的话: process.on(‘uncaughtException’, (e) => { console.error(e) })

@liuqipeng417 试了一下效果, 相当于全局的 try/catch 了, 有意思

回到顶部