我一直在研究处理 Node 错误的正确方法,并在 StackOverflow 和 NodeJS 的网站上找到了一些很好的答案,例如如何防止 node.js 崩溃?try-catch 不起作用,NodeJS 文档本身:http://nodejs.org/api/domain.html。
但是,我还有几个关于何时何地使用 try/catch 和/或域的问题。我意识到这与异步与同步代码有关,但即使在 NodeJS 网站上提供的有关域的示例代码中,它们也在域的错误处理程序中使用 try/catch。有人可以详细解释一下,try/catch 不会在错误处理程序中捕获异步错误吗?
除此之外,NodeJS 的文档建议您仍然应该在出现异常时结束进程,这就是为什么 Domain 文档中的代码建议在捕获到异常时使用集群来分叉一个新的子进程/工作者。给出的主要原因是:
由于 throw 在 JavaScript 中的工作原理,几乎没有任何方法可以安全地“从上次中断的地方继续”,而不会泄漏引用或创建其他类型的未定义的脆弱状态。
有人可以解释一下吗?throw 在 Javascript 中的工作原理是什么?为什么资源会疯狂泄漏?是否真的有必要重新启动进程或杀死/启动工作人员?
例如,我正在实现JugglingDB ORM,并且有一次忘记启动我的本地 mysql 服务器。我遇到了一个ECONNREFUSED
导致进程崩溃的错误。意识到这可能发生在生产环境中(数据库崩溃或暂时不可用),我想捕捉这个错误并优雅地处理它;重试连接,维护有关数据库的状态变量,并可能通过响应暂时不可用的消息来处理请求。Try/Catch 根本没有捕捉到错误,虽然我看到我可以使用域,但使用推荐的策略,我将处于杀死和启动工作人员的无限循环中,直到数据库重新联机。
JugglingDB,无论出于何种原因,只有一个“连接”事件,但没有任何类型的回调函数来传递错误对象;它会在您实例化类的那一刻尝试连接,并抛出错误,这些错误不会以优雅的方式捕获和发出。这让我想看看其他 ORM,但这仍然不能回答我关于如何处理这种情况的问题。使用域来捕获潜在的连接错误并在不启动新进程的情况下优雅地处理它会不会是错误的?
这是我在 JugglingDB github 上发布的问题/问题:https ://github.com/1602/jugglingdb/issues/405 ,这是 JugglingDB 在服务器不存在时产生的错误的堆栈跟踪(仅启用池选项时发生):
Error: connect ECONNREFUSED
at errnoException (net.js:901:11)
at Object.afterConnect [as oncomplete] (net.js:892:19)
--------------------
at Protocol._enqueue (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/protocol/Protocol.js:110:48)
at Protocol.handshake (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/protocol/Protocol.js:42:41)
at PoolConnection.Connection.connect (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Connection.js:101:18)
at Pool.getConnection (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Pool.js:42:23)
at Pool.query (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/node_modules/mysql/lib/Pool.js:185:8)
at initDatabase (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:62:20)
at initializeConnection (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:49:9)
at Object.initializeSchema [as initialize] (/Users/aaronstorck/Sites/site/node_modules/jugglingdb-mysql/lib/mysql.js:33:5)
at new Schema (/Users/aaronstorck/Sites/site/node_modules/jugglingdb/lib/schema.js:105:13)
at Application.loadConnections (/Users/aaronstorck/Sites/site/core/application.js:95:40)
Process finished with exit code 8
提前感谢您提供的任何部分,您可以帮助我理解!:)