node.js中的不可捕捉的错误

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

这个效果很好,除了有时我会在用户断开连接时发送消息。

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

解决方法是为stream的“错误”事件添加一个侦听器。 起初,这看起来可能是违反直觉的,但理由是正确的。

stream.write()asynchronous发送数据。 当节点已经意识到写入套接字已经引发了一个错误,你的代码已经移动,通过调用stream.write,所以没有办法让它提高错误。

相反,在这种情况下,哪个节点会从stream中发出“错误”事件,并且EventEmitter会进行编码,以便如果没有侦听器发生“错误”事件,则会将错误引发为顶级exception,并且进程结束。

彼得很对,

还有另外一种方法,你也可以用catch来捕捉所有的error handling程序

 process.on('uncaughtException',function(error){ // process error }) 

这将捕捉到所有被抛出的东西

如果可能的话,这样做通常会更好,但是如果你在写一个testing框架的时候,使用process.on('uncaughtException',...可能是个好主意process.on('uncaughtException',...

这里是涵盖(我认为)在nodejs中处理错误的所有不同方法的要点http://gist.github.com/636290

我从这里的时间服务器的例子有同样的问题我的客户端被杀害,时间服务器然后尝试写入封闭的套接字。

设置error handling程序不起作用,因为错误事件仅在接收时触发。 时间服务器不接收,(请参阅stream事件文档)。

我的解决scheme是在streamclosures事件上设置一个处理程序。

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