====== Асинхронный try..catch ======

  npm i domain
  
===== Особенности =====

Domain не сможет отловить ошибки, которые возникли в модулях, инициализированных вне контекста domain. К примеру модули подключаемые в начале модуля с помощью require()
В большинстве случаев к таким модулям относятся модули работающие с внешними источниками данных. К примеру: mongodb, redis, mysql итд.

===== Использование =====

Для того чтоб домаин отлавливал все ошибки, все реализации приложений и библиотек должны происходить в его контексте те domain.run() или должны быть связаны методом domain.bind()

==== Пример ====

app.js
<code php>
var domain = require('domain');

var serverDomain = domain.create(); // домен для ошибок, выпадающих из server.listen

serverDomain.on('error', function(err) {
  console.error("Серверная ошибка %s", err);
  process.exit(255);
});

serverDomain.run(function() {

    var http = require('http');
    var handler = require('./handler');

    var server = http.createServer(function(req, res) {

    var requestDomain = domain.create(); // домен для ошибок во время запроса
    requestDomain.add(req);
    requestDomain.add(res);

    requestDomain.on('error', function(err) {
        res.statusCode = 500;
        res.end(err.message);
        // ...
        serverDomain.emit('error', err);
    });

    requestDomain.run(function() {
        handler(req, res);
    });
    });

    server.listen(3000);
});
</code>

handler.js
<code php>
var fs = require('fs');

module.exports = function handler(req, res) {
  if (req.url == '/') {

    fs.readFile('no-such-file', function(err, content) {

      if (err) throw err; // JSON.parse("invalid!")

      res.end(content);
    });

  } else {
    res.statusCode = 404;
    res.end("Not Found");
  }

};
</code>