CNode

setTimeout 报错导致整个进程退出, 是正常行为吗

问答
Jjiyinyiyong发布于9 年前最后回复9 年前3 回复4823 浏览0 收藏

在浏览器环境习惯了, 记不起来 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)

H
hyj1991#1·9 年前

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

L
liuqipeng417#2·9 年前

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

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

参与回复
登录后即可参与回复。登录