- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个简单的 iojs http 服务器,它与我的开发机器上的另一个 http 后端通信。现在我的 ip 已经改变了,由于 ip 错误,后端请求将无法工作。我有(或者至少是这么认为的)错误管理,但是服务器在某些情况下由于未处理的异常而崩溃:
当执行 2 个后续请求时,第一个“挂起”,然后第二个请求使服务器崩溃:
events.js:141
throw er; // Unhandled 'error' event
^
Error: connect EHOSTDOWN 192.168.1.11:80 - Local (192.168.1.10:54125)
at Object.exports._errnoException (util.js:846:11)
at exports._exceptionWithHostPort (util.js:869:20)
at connect (net.js:840:14)
at lookupAndConnect (net.js:933:5)
at Socket.connect (net.js:902:5)
at Agent.exports.connect.exports.createConnection (net.js:61:35)
at Agent.createSocket (_http_agent.js:177:16)
at Agent.addRequest (_http_agent.js:147:23)
at new ClientRequest (_http_client.js:132:16)
at Object.exports.request (http.js:30:10)
有问题的错误不会触发 backRequest.on("error", errFn)
它不是 function(err, response, body)
中的标准错误.无法使用 try...catch 捕获它。
我如何捕捉并优雅地处理这个错误?
我深入研究了 net.js/http.js。手动发出套接字错误时:
backendRequest.on("socket", function(socket) {
socket.emit("error", "DIE!");
});
它由正常的错误处理程序处理。然而 EHOSTDOWN 错误不是。这样做的原因似乎是套接字错误处理程序仅在 Socket.connect() 之后的下一个滴答中安装(参见 https://github.com/joyent/node/blob/master/lib/_http_client.js#L498 )。
然而,“我的”错误是在 connect() 上直接触发的(必须与仍在尝试查找主机的第一个连接有关)。
我可以使用自定义 Agent.createConnection 优雅地捕获该错误:
var socket = net.createConnection(options);
// install error handler immediately
socket.on("error", function(err) {
console.log("AHA", err);
});
return socket;
然而,这看起来非常冗长和笨重。这真的是最好的方法吗?该错误似乎并不那么特殊,并且似乎在核心库中未得到处理。为什么会这样,为什么套接字错误处理程序只安装在 nextTick 上?
您将如何正确捕获该错误?代理的方式是否正确?
可在此处找到可玩的“完整”示例:http://pastebin.com/jaCUPaHX
最佳答案
正如评论者所指出的:这是一个错误 https://github.com/nodejs/io.js/pull/2054
关于javascript - 使用 iojs 创建 http 请求时如何捕获 EHOSTDOWN 套接字错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30458800/
connect() 中发生这些错误时如何响应(非阻塞)?我想知道是否应该终止此套接字并创建一个新套接字,或者我可以等待一段时间并使用现有套接字重试,一切都会正常(如果远程主机联机)? 最佳答案 在这些
我有一个简单的 iojs http 服务器,它与我的开发机器上的另一个 http 后端通信。现在我的 ip 已经改变了,由于 ip 错误,后端请求将无法工作。我有(或者至少是这么认为的)错误管理,但是
我是一名优秀的程序员,十分优秀!