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