node.js обрабатывает исключения с помощью Q

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

Сейчас я работаю над проектом с разработчиком, который использует Q, и он вызывает некоторые из моих обратных вызовов. основанные функции с оболочкой, использующей Q.nfbind. Однако это вызывает у меня головную боль при обработке ошибок. Например, предположим, что у меня есть функция, которая может выполнить обратный вызов с ошибкой:

function doSomething(x, callback) {
    dbpool.acquire(function(err, conn) {
        if (err) return callback(err);

        conn.query('INSERT INTO some_table (x) VALUES (?)', [x],
        function(err, result) {
            dbpool.release(conn);
            if (err) return callback(err);
            callback(null, result.insertId);
        });
}
var qDoSomething = Q.nfbind(doSomething);

С помощью Q я могу вызвать qDoSomething и нормально обработать ошибку:

qDoSomething('abc')
.fail(function(err) {
     ...
});

Теперь предположим, что однажды ночью я работал слишком поздно и проверил такой код внутри моей функции doSomething() непосредственно перед запросом:

var foo;
foo.doAnotherThing();

В моем мире до Q это было бы плохо. Будет выброшено исключение, что приведет к сбою приложения и его перезапуску навсегда. Однако после перезапуска приложения оно, по крайней мере, будет функционировать до тех пор, пока этот путь кода не будет снова использован. Однако с помощью Q это исключение теперь перехватывается и обрабатывается обработчиком ошибок. Этот обработчик не может устранить повреждение, так как ничего не знает о пуле соединений. Теперь каждый раз при попадании по этому пути кода происходит утечка соединения из пула, и в конечном итоге приложение блокируется. Влияние этой ошибки только что стало ужасным.

Я не знаю, как с помощью Q различать ошибки, которые были первоначально выданы, и те, которые возникли из-за ошибки обратного вызова. Кажется, я застрял в обработке всего или ничего. Может ли кто-нибудь предложить способ вернуться из ужасного в плохое?


person David Johnson    schedule 21.02.2013    source источник


Ответы (1)


Как насчет подкласса Error, чтобы обернуть эти err?

var MyError = function() {
  Error.apply(this, arguments);
};

var generateError = function(callback) {
  callback(new MyError('some reason'));
};
var doSomething = q.nfbind(generateError);

doSomething()
  .fail(function(e) {
    console.log('Was this a MyError instance?', e instanceof MyError);
  });
person robertklep    schedule 21.02.2013
comment
Имеет смысл. Почти то же, что я сделал бы на Java или C#. Спасибо! - person David Johnson; 21.02.2013