Как обработать исключение nodejs EMFILE без изменения ulimit? - PullRequest
7 голосов
/ 26 июня 2011

Я новичок в Node.JS и застрял с ошибкой EMFILE. Я пытаюсь поймать исключение EMFILE и обработать его в коде.

Кажется, есть много вопросов об ошибке «Ошибка: EMFILE, слишком много открытых файлов», но большинство ответов похоже на «Увеличить ваш предел».

Мой первый вопрос: как мне поймать это исключение? Когда я запускаю приведенный ниже код с многими соединениями, возникает ошибка 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 а также Простой прокси-узел nodejs http завершается с «слишком большим количеством открытых файлов» в качестве ссылок, но я не уверен, как применить метод изящный из npm к вызову createConnection.

Большое спасибо!

1 Ответ

3 голосов
/ 11 июля 2011

Даже если бы вы могли поймать это исключение, есть ли что-нибудь полезное, что бы вы сделали с этим?Если у вас где-то есть утечка, вам нужно исправить утечку, и если у вас нормальная, но очень высокая нагрузка, вам нужно как-то справиться с этим.В любом случае, когда вы сталкиваетесь с этим условием, в вашем процессе узла все довольно плохо.

К сожалению, когда вы обрабатываете событие uncaughtException, единственная безопасная вещь, которую нужно сделать, - записать сообщение об ошибке и затем выйти из процесса.Стек, в который было сгенерировано исключение, теперь исчез, и скорее всего возникнет глубокая внутренняя путаница.

Лучшее решение - увеличить количество файловых дескрипторов, доступных процессу.Хорошей новостью является то, что файловые дескрипторы действительно дешевы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...