Работа с исключениями node.js - PullRequest
       1

Работа с исключениями node.js

3 голосов
/ 29 декабря 2011

Мы хотим использовать node.js для высокодинамичного проекта. Традиционно мы использовали Java, и при возникновении необработанного исключения выдается ошибка, но веб-приложение (обычно) продолжает обслуживать другие запросы.

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

Мне было интересно, есть ли учебные пособия / инструменты / и т. Д., Чтобы помочь решить проблему с исключениями. Например, есть ли способ добавить глобальное исключение типа последнего средства, которое?

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Как уже упоминалось здесь вы найдете error.stack предоставляет более полное сообщение об ошибке, например номер строки, вызвавшей ошибку:

process.on('uncaughtException', function (error) {
   console.log(error.stack);
});
3 голосов
/ 29 декабря 2011
process.on('uncaughtException', function (err){
  console.error(err)
})
1 голос
/ 26 июля 2013

Вы должны использовать Node.js domains :

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

Лучше всего отправить ответ об ошибке назапрос, который вызвал ошибку, позволяя остальным закончить в обычное время и прекратить прослушивать новые запросы этого работника.

На связанных страницах приведен пример кода, который я несколько упростил ниже.Это работает как описано выше.Вы должны либо вызывать свой сервер так, чтобы он автоматически перезапускался при его выходе, либо использовать рабочий шаблон из полного примера .

var server = require('http').createServer(function(req, res) {
  var d = domain.create();
  d.on('error', function(er) {
    console.error('error', er.stack);

    try {
      // make sure we close down within 30 seconds
      var killtimer = setTimeout(function() {
        process.exit(1);
      }, 30000);
      // But don't keep the process open just for that!
      killtimer.unref();

      // stop taking new requests.
      server.close();

      // try to send an error to the request that triggered the problem
      res.statusCode = 500;
      res.setHeader('content-type', 'text/plain');
      res.end('Oops, there was a problem!\n');
    } catch (er2) {
      // oh well, not much we can do at this point.
      console.error('Error sending 500!', er2.stack);
    }
  });

  // Because req and res were created before this domain existed,
  // we need to explicitly add them.
  d.add(req);
  d.add(res);

  // Now run the handler function in the domain.
  d.run(function() {
    // your application logic goes here
    handleRequest(req, res);
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...