node.js中无法捕获的错误

时间:2010-05-23 21:08:48

标签: error-handling tcp node.js

所以我正在尝试编写一个简单的TCP套接字服务器,向所有连接的客户端广播信息。因此,当用户连接时,它们会被添加到客户端列表中,当流发出close事件时,它们将从客户端列表中删除。

这种方法效果很好,但有时我会在用户断开连接时发送消息。

我尝试在stream.write()块中包裹try/catch,但没有运气。似乎错误是无法捕获的。

3 个答案:

答案 0 :(得分:18)

解决方案是为流的'error'事件添加一个监听器。这起初看起来似乎是违反直觉的,但是它的合理性是合理的。

stream.write()以异步方式发送数据。当节点意识到写入套接字时引发了代码已经移动的错误,经过对stream.write的调用,所以没有办法在那里引发错误。

相反,在这种情况下,哪个节点从流中发出“错误”事件,并且对EventEmitter进行编码,使得如果没有“错误”事件的侦听器,则会将错误引发为顶级异常,并且这个过程结束了。

答案 1 :(得分:15)

彼得是对的,

还有另一种方法,你也可以使用

捕获所有错误处理程序
process.on('uncaughtException',function(error){
// process error
})

这将抓住抛出的所有东西......

如果可能的话,通常更好地做这个peter的方式,但是如果你在编写测试框架的地方,那么使用process.on('uncaughtException',...

可能是个好主意。

这里有一个要点,它涵盖了(我认为)nodejs中处理错误的所有不同之处 http://gist.github.com/636290

答案 2 :(得分:1)

我在here的时间服务器示例中遇到了同样的问题 我的客户端被杀死,然后时间服务器尝试写入已关闭的套接字。

设置错误处理程序不起作用,因为错误事件仅在接收时触发。时间服务器没有接收,(参见流事件文档)。

我的解决方案是在流关闭事件上设置处理程序。

stream.on('close', function() {
    subscribers.remove(stream);
    stream.end();
    console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n");
});