Я использую узел в течение нескольких месяцев. Для обработки ошибок в асинхронном коде я следил за 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, чтобы различать ошибки, которые были первоначально выбраны, и те, которые возникли с помощью ошибки обратного вызова. Кажется, я застрял в обработке всего или ничего. Может ли кто-нибудь предложить способ вернуться от ужасного к плохую?
Имеет смысл. В значительной степени то, что я сделал бы на Java или C#. Благодаря! –