【问题标题】:Is node error handling really this dangerous?节点错误处理真的这么危险吗?
【发布时间】:2015-07-25 22:05:49
【问题描述】:

我说的是一个简单的错误,比如......

arr.forEach   --> when arr is undefined

会关闭整个节点线程吗?意味着所有用户都将断开连接?

如果是这样的话,我感到很惊讶,因为这肯定是非常不方便的。特别是如果我有多个用户都在运行聊天应用程序。

如果是这种情况,我如何确保我的代码永远没有错误?

更新:

我真的不认为自动重启是解决这个问题的一项功能......

【问题讨论】:

  • 这个答案比我的更合适
  • 如果此错误出现在执行的主线中,那么是的。但是,99% 的时间节点都在运行侦听器或处理程序或回调,这会崩溃是的,但节点当然会继续运行并侦听和调度。在像 koa 这样的现代框架中,99% 的执行发生在大型 try-catch 构造的上下文中,这些构造将简单地失败,被最近的处理程序捕获,然后生活继续。
  • 自动重启不能解决问题是什么意思?每个人都是这样做的。它有什么缺点?

标签: javascript node.js


【解决方案1】:

无论是在浏览器还是节点中,99% 的 JS 执行都是在运行侦听器或处理程序或回调或分派例程。如果侦听器崩溃了,那么它肯定会崩溃并且可能会发生坏事,但是节点(或浏览器)当然会继续运行并侦听和调度。

在像 koa 这样的现代框架中,99% 的执行发生在相当于大型 try-catch 构造的上下文中,这些构造会简单地失败,可能会触发 promise 失败,然后被最近的处理程序捕获,然后生命就结束了在。

如果错误出现在执行的主线中,即正在设置、启动或初始化的地方,那么是的,你会不走运,但你要做的就是到达app.listen()不会崩溃。

所以你的问题的答案是:不,节点错误处理并不是那么危险。

【讨论】:

  • 这可能是人们很少用 C++ 编写网络服务器的原因。 (C++ 也有例外,但如果人们写 thisIsNull->performAction();,它们并没有多大帮助)
  • 当你不为net模块的socket设置错误处理程序时,节点崩溃。如果一路没有catch,任何处理来自socket的新数据产生异常的代码也会导致节点崩溃。
【解决方案2】:

您可能应该使用域。域为我们提供了一种方法来处理绑定到特定域的所有事件发射器和回调的错误事件。

所有错误都会传播到该域,而不会丢失错误的上下文。您可以在域调用中包装一个函数,订阅错误事件并在一个地方处理所有错误。

域确保您的函数独立运行,并且它的错误不会冒泡到进程中。如果错误是应用程序应该能够从中恢复的错误,这是防止节点进程退出的好方法。

http://www.howtojs.org/understanding-exceptions-domains-in-nodejs/

【讨论】:

    【解决方案3】:

    typeof arr === 'array' 在对动态创建的对象进行任何迭代之前。其他语言也会因此异常而崩溃。

    【讨论】:

    • @Juhana 我不这么认为,但答案可能需要一些改进。
    • 问题中的代码只是一个例子。问题是“如何防止 Node 因 any 错误而崩溃。”
    • Jas 我不是在为那一行寻找代码审查,我提供的代码示例可能会引发错误....我正在寻找某种解决方案,例如某种全局异常捕手....谢谢....
    • 没有类型"array"typeof [] === "object"。这也是不幸的,因为typeof null === "object" 也是如此。这甚至不能解决错误问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-08
    • 2015-03-08
    • 2010-12-25
    相关资源
    最近更新 更多