【问题标题】:Uncatchable errors in node.jsnode.js 中无法捕获的错误
【发布时间】:2011-02-23 00:30:44
【问题描述】:

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

这很好用,只是有时我会在用户断开连接时发送消息。

我尝试将stream.write() 包装在try/catch 块中,但没有运气。看起来错误是无法捕获的。

【问题讨论】:

    标签: error-handling tcp node.js


    【解决方案1】:

    解决方案是为流的“错误”事件添加一个侦听器。乍一看,这似乎违反直觉,但它的理由是合理的。

    stream.write() 异步发送数据。当该节点意识到写入套接字引发了错误时,您的代码已经继续前进,超过了对 stream.write 的调用,因此它无法在此处引发错误。

    相反,节点在这种情况下所做的是从流中发出一个“错误”事件,并且 EventEmitter 被编码为如果没有“错误”事件的侦听器,则该错误将作为顶级异常引发,并且该过程结束。

    【讨论】:

    • 很好的答案!我在这里的另一个问题:通常应该做什么错误处理程序(侦听器):只记录错误还是调用next回调?
    【解决方案2】:

    彼得说的很对,

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

    来做一个 catch all 错误处理程序
    process.on('uncaughtException',function(error){
    // process error
    })
    

    这将捕获所有抛出的东西......

    如果可能的话,通常最好按照彼得的方式进行,但是如果您在编写测试框架,那么使用process.on('uncaughtException',... 可能是个好主意

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-27
        • 2012-12-12
        • 1970-01-01
        • 2016-05-28
        • 2021-06-04
        相关资源
        最近更新 更多