【发布时间】:2011-02-23 00:30:44
【问题描述】:
所以我正在尝试编写一个简单的 TCP 套接字服务器,它将信息广播到所有连接的客户端。因此,当用户连接时,它们会被添加到客户端列表中,而当流发出关闭事件时,它们会从客户端列表中移除。
这很好用,只是有时我会在用户断开连接时发送消息。
我尝试将stream.write() 包装在try/catch 块中,但没有运气。看起来错误是无法捕获的。
【问题讨论】:
标签: error-handling tcp node.js
所以我正在尝试编写一个简单的 TCP 套接字服务器,它将信息广播到所有连接的客户端。因此,当用户连接时,它们会被添加到客户端列表中,而当流发出关闭事件时,它们会从客户端列表中移除。
这很好用,只是有时我会在用户断开连接时发送消息。
我尝试将stream.write() 包装在try/catch 块中,但没有运气。看起来错误是无法捕获的。
【问题讨论】:
标签: error-handling tcp node.js
解决方案是为流的“错误”事件添加一个侦听器。乍一看,这似乎违反直觉,但它的理由是合理的。
stream.write() 异步发送数据。当该节点意识到写入套接字引发了错误时,您的代码已经继续前进,超过了对 stream.write 的调用,因此它无法在此处引发错误。
相反,节点在这种情况下所做的是从流中发出一个“错误”事件,并且 EventEmitter 被编码为如果没有“错误”事件的侦听器,则该错误将作为顶级异常引发,并且该过程结束。
【讨论】:
next回调?
彼得说的很对,
还有另一种方法,你也可以用
来做一个 catch all 错误处理程序process.on('uncaughtException',function(error){
// process error
})
这将捕获所有抛出的东西......
如果可能的话,通常最好按照彼得的方式进行,但是如果您在编写测试框架,那么使用process.on('uncaughtException',... 可能是个好主意
这里有一个要点,它涵盖了(我认为)在 nodejs 中处理错误的所有不同方法 http://gist.github.com/636290
【讨论】:
here 的时间服务器示例遇到了同样的问题 我的客户被杀死,然后时间服务器尝试写入已关闭的套接字。
设置错误处理程序不起作用,因为错误事件仅在接收时触发。时间服务器不接收,(请参阅流事件文档)。
我的解决方案是在流关闭事件上设置一个处理程序。
stream.on('close', function() {
subscribers.remove(stream);
stream.end();
console.log('Subscriber CLOSE: ' + subscribers.length + " total.\n");
});
【讨论】: