所以我正在尝试编写一个简单的TCP套接字服务器,向所有连接的客户端广播信息。因此,当用户连接时,它们会被添加到客户端列表中,当流发出close事件时,它们将从客户端列表中删除。
这种方法效果很好,但有时我会在用户断开连接时发送消息。
我尝试在stream.write()
块中包裹try/catch
,但没有运气。似乎错误是无法捕获的。
答案 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");
});