我是 Node.JS 的新手,遇到了 EMFILE 错误。我正在寻找一种捕获 EMFILE 异常并在代码中处理它的方法。
似乎有很多关于“错误:EMFILE,打开的文件太多”错误的问题,但大多数答案似乎都是“增加您的 ulimit”。
我的第一个问题是,如何捕捉这个异常?当我使用许多 连接运行以下代码时,它会引发 EMFILE 错误:
stream = net.createConnection(port, host);
stream.addListener('connect', function() {
return stream.write(request);
});
stream.addListener('data', function(data) {
return console.log(data);
});
stream.addListener('end', function() {
stream.end();
return callback();
});
stream.addListener('timeout', function() {
stream.destroy();
console.log("timeout");
return callback();
});
stream.addListener('error', function(e) {
console.log("this never gets called");
return
});
异常没有被“错误”监听器捕获。我尝试将上面的内容包装在 try{} catch (e) {}
中,但没有任何反应。我为 createConnection 使用了回调方法,它没有返回任何错误。
我能够捕获异常的唯一方法是:
process.on('uncaughtException', function(err) {
console.log(err);
});
这似乎不安全,因为它会捕获所有内容。
所以我的第二个问题是:捕获错误并重试调用的“最佳实践”方法是什么?
我看过: https://github.com/isaacs/npm/blob/master/lib/utils/graceful-fs.js 和 Simple nodejs http proxy fails with "too many open files" 作为引用,但我不确定如何将 npm 中的 优雅 方法应用到 createConnection 调用。
非常感谢!
最佳答案
即使您可以捕捉到这个异常,您是否会对此做些有用的事情?如果你在某处有泄漏,你需要修复泄漏,如果你有正常但非常高的负载,那么你需要以某种方式处理这个问题。无论哪种方式,当您遇到这种情况时, Node 进程中的情况都非常糟糕。
不幸的是,当您处理 uncaughtException 事件时,唯一安全的做法是记录一条错误消息,然后退出进程。抛出异常的堆栈现在已经不存在了,很可能很快就会产生严重的内部困惑。
最好的解决方案是增加进程可用的文件描述符的数量。好消息是文件描述符真的很便宜。
关于asynchronous - 如何在不修改ulimit的情况下处理nodejs EMFILE异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486162/