2013-02-21 3 views
2

Я использую узел в течение нескольких месяцев. Для обработки ошибок в асинхронном коде я следил за best practice, о котором я знаю, который предназначен для обработки ошибок с помощью аргумента ошибки обратного вызова и для того, чтобы большинство исключений выходило из строя и разбивало приложение, поскольку на самом деле нет путь к чистому восстановлению.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); 

С QI тогда можно назвать qDoSomething и обрабатывать ОК ошибки:

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

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

var foo; 
foo.doAnotherThing(); 

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

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

ответ

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); 
    }); 
+0

Имеет смысл. В значительной степени то, что я сделал бы на Java или C#. Благодаря! –

Смежные вопросы