- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在研究处理Node中错误的正确方法,并在StackOverflow和NodeJS的站点上找到了一些不错的答案,例如How do I prevent node.js from crashing? try-catch doesn't work和NodeJS文档本身:http://nodejs.org/api/domain.html。
但是,关于何时何地使用try/catch和/或域,我还有几个问题。我意识到这与异步代码还是同步代码有关,但是即使在NodeJS网站上提供的有关域的示例代码中,它们也在域的错误处理程序中使用try/catch。有人可以详细解释一下吗,try/catch不会在错误处理程序中捕捉异步错误吗?
除此之外,NodeJS的文档建议您仍应在异常上终止流程,这就是Domain文档的代码建议在捕获异常时使用群集派生新的子流程/ worker 的原因。给出的主要原因是:
By the very nature of how throw works in JavaScript, there is almost never any way to safely "pick up where you left off", without leaking references, or creating some other sort of undefined brittle state.
ECONNREFUSED
错误,导致程序崩溃。意识到这可能会在生产环境中发生(数据库崩溃或暂时不可用),我想捕获此错误并优雅地处理它;重试连接,维护有关数据库的状态变量,并可能通过以暂时不可用的消息进行响应来处理请求。 Try/Catch根本无法捕获错误,尽管我看到我可以使用推荐的策略来使用域,但是在数据库重新联机之前,我将陷入无休止的死活并启动工作程序的循环。
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
最佳答案
查看JugglingDB,并尝试连接到笔记本电脑上不存在的mysql服务器,我确实收到ECONNREFUSED
,但是它仅每隔几秒钟记录一次(请尝试重新连接),并且不会使我的进程崩溃。我将我的jugglingdb-mysql降级为0.0.6,然后可以复制您所说的内容。我查看了jugglingdb-mysql的源代码,发现是否发现了连接错误,只是抛出了错误。那是不好的,不是很好的行为。尽管垃圾邮件日志也很糟糕,但是引发可处理的错误的情况更糟。因此,我建议升级到0.0.7或0.0.8(最新),这样您就不必担心此错误。我只是为JugglingDB或jugglingdb-mysql作一个错误报告,以像node-mysql一样正确地传播错误。 node-mysql是一个很好的例子。
现在让我们来看一下如何处理node.js中的错误。并非所有错误都引发在node.js中。例如,您可以执行以下操作:
require('fs').readFile('non-existent-file-yes-gimmie-a-error', function (error) { })
error
事件。较旧的jugglingdb-mysql版本是如何处理错误的非常糟糕的示例。如果您无法使用
try catch
捕获错误,则不应抛出该错误。仅在可捕获时抛出,就像node.js核心库函数一样。如果执行
require('fs').readFile()
,它将立即引发错误,这是可捕获的。但是在发现错误的情况下,函数返回后(在处理异步事件时),它将调用带有错误的回调。
error
事件。在node.js中,当发出
error
事件时,为
if there are no handlers it will thrown。因此,如果您想捕获事件发射器的错误,只需添加一个
error
事件。一个示例是
fs.createReadStream
,它将返回事件发射器:
require('fs').createReadStream('non-exitent-file-gimmie-a-error')
error
处理程序,它将不再抛出错误:
require('fs').createReadStream('non-exitent-file-gimmie-a-error').on('error', handleError)
var routes = {
'/' : function () {...},
'/one' : function () {...},
'/two' : function () {...}
}
require('http').createServer(function (req, res) {
fs.open('layout.html', 'r', function (err, fd) {
if (err) return errorHandler(err);
var buffer = new Buffer(4000); // Lets say we know our file is 4000 bytes exatly
fs.read(fd, buffer, 0, 4000, function (err, data) {
if (err) return errorHandler(err);
try {
routes[req.url](req, res, data);
fs.close(fd);
} catch (e) {
errorHandler(err);
}
});
});
function errorHandler(err) {
res.writeHead(404);
res.end();
}
}).listen(1337)
routes[req.url]
是否不存在,因为我们正在尝试调用errorHandler,所以将引发错误,但是该文件保持打开状态,并且我们忘记在出错时将其关闭。如果发出10000个带有错误URL的请求,则表明您已用完进程的最大打开文件数限制。您可以解决此问题,但可以将
fs.close(fd)
放在finally子句中。
try
和
catch
,但是使用全局域捕获了错误。在某些情况下,您将不再知道程序的状态,因此在出现错误时,您不能仅决定让应用程序继续运行,因为在这种情况下,它将泄漏文件描述符。
process.on('uncaughtException')
或
domain.on('error')
捕获错误,但是在完成清理后必须终止该过程。
unref
在节点v0.10上设置超时,以确保它不会使进程保持 Activity 状态;在v0.8上,您可以使用
addTimeout这样的模块,该模块将在调用回调时清除超时。
关于javascript - 了解 Node 的错误处理的尝试/捕获和域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23850866/
说真的,你怎么能在不发疯的情况下处理所有这些异常呢?我是不是读了太多关于异常处理的文章或什么?我尝试重构了几次,但每次似乎都以更糟糕的结果告终。也许我应该承认确实会发生异常(exception)情况,
背景 两者 try/rescue和 try/catch是 Elixir 中的错误处理技术。根据 corresponding chapter在介绍指南中。 Errors can be rescued u
每当我尝试在 Raspberry PI 上运行此 python 脚本时,我都会遇到问题: import socket import sys # Create a TCP/IP socket sock
我想知道一些关于 PHP 的 try , catch声明。 让我们考虑以下示例。 abstract class ExceptionA extends Exception {} class Except
我的 laravel v5.4 项目中有两个模型,user 和 admin。 在 config/auth.php 中,我向守卫和提供者添加了管理员,如下所示: 'guards' => [ 'w
try: r = requests.get(url, params={'s': thing}) except requests.ConnectionError, e: print e
我有以下代码。 但是,它并不能捕获所有错误,而我仍然会收到“throw er;//未处理的'错误'事件”。 为什么是这样? app.post('/api/properties/zip/:zip/bed
问题与细节 我正在使用自定义错误处理,遇到的错误之一是“路径中的非法字符”。我有一个自定义函数,旨在通过路径字符串查找此类非法字符,并在找到它们时引发自定义错误。但是我发现,取决于非法字符,Test-
This question already has answers here: How do I catch a numpy warning like it's an exception (not j
我正在使用其他人的代码,但我不熟悉try/catch,因此我举了一个类似的小例子。在第11行上,如果我写了error(''),似乎没有发现错误并增加了索引j。但是,编写error(' ')或error
我在我的一个程序中遇到了这个问题,在这种情况下,尝试/异常(exception)的错误使程序变得更好,以防用户意外输入了他们不应该输入的内容。它仍然给我错误,我为为什么感到困惑。如果对我的问题确实很重
我在尝试TRY ... CATCH块时遇到问题。有人可以解释为什么以下代码无法执行我的sp吗? DECLARE @Result int SET @Result = 0 BEGIN TRY SE
我有一个相当大的 powershell 脚本,其中包含许多(20 多个)执行各种操作的函数。 现在所有代码实际上都没有任何错误处理或重试功能。如果某个特定的任务/功能失败,它就会失败并继续。 我想改进
为什么我尝试时需要导入 inputmismatchException catch(InputMismatchException e){ System.out.println("
我对此感到困惑 - 我为辅助方法编写了一个 try/catch 。它的目的是捕获任何无效输入(任何不是“男性”或“女性”的内容(没有特定情况)。如果输入无效,它将通知用户,然后让他们重试。如果有效,则
我有时会发现自己处于如下场景。尽可能简单地陈述问题 “有时我会创建一段代码,Java 让我将其包含在 try/catch 语句中。我没有使用 catch,所以我将其留空。为什么这是错误的?” boo
我有点困惑为什么当我不使用 Try block 时会出现 Try block 错误。 我在代码块底部附近收到错误通知。如果我不使用 try/catch,有人可以向我解释为什么会发生这种情况吗? 它是否
我已经盯着我的电脑两个小时了,我不知道我做错了什么。谁能帮助我看到光明? package blackjack; import java.util.Random; import java.util.Sc
我想将方法保存在 Enum 中,但 Class.getDeclaredMethod 抛出 NoSuchMethodException,那么我该如何处理呢?我的代码: public enum Car
这个问题已经有答案了: Executing multi-line statements in the one-line command-line (18 个回答) 已关闭 3 年前。 如何使用try.
我是一名优秀的程序员,十分优秀!