Я пытаюсь придумать общий (ухаживающий) способ обработки исключений в NodeJS, который не использует попытку catch из-за удара производительности. Я также хочу держаться подальше от библиотек, таких как streamline, которые пытаются сделать асинхронный код похожим на код синхронизации.Написание функций, связанных с доменом в NodeJS
Кажется, что Домены хорошо подходили к законопроекту, но я хотел пригласить комментарии/предложения по пути, который я предлагаю использовать. Существуют ли серьезные проблемы с этим подходом?
Я планирую сделать большинство моих функций асинхронными следовать схеме функции domainAware ниже:
function errorinAsync(options, callback){
options = options || {};
setTimeout(function(){
return callback(new Error("This should be caught"));
},1000);
}
function domainAware(options, callback){
if(domain.active){
d = domain.active;
}else{
d = domain.create();
d.on('error', function(err){
return callback(err);
});
}
d.run(function(){
//Some Synchronous code that might throw an exception;
var a = {b: 1, c: 2};
var thing = JSON.stringify(a);
errorinAsync(null,d.intercept(function(err) {
return callback(null);
}));
});
}
То, что я хочу сделать, это избежать бросать ошибку в функции асинхронной. Это в основном для ситуаций, когда у меня нет каких-либо особых исключений, которые я хочу обработать, но я хочу, чтобы исключения не терялись.
Я могу назвать это с контекстом домена:
var d = domain.create();
d.on('error', function(er) {
console.error('Caught error!', er);
});
d.run(function() {
domainAware(null, d.intercept(function(err) {
console.log("all Done");
}));
});
Или без один:
domainAware(null, function(err){
if(err){
return console.log("Caught Error from Callback" + err);
}
console.log("all Done");
});
Это надуманный пример работает хорошо, но как насчет более сложных сценариев с большим количеством функций.
Обновление: # 1
Эквивалентная функция с помощью попытке поймать может быть:
function noHandling(callback){
var a = {b: 1, c: 2};
var thing = JSON.stringify(a);
errorinAsync(null,function(err) {
if(err) return callback(err);
return callback(null);
});
}
function notDomainAware(options, callback){
try{
noHandling(callback);
}catch(err){
callback(err);
}
}
Я буду делать некоторые тесты производительности на этих двух подходов, чтобы увидеть, если есть какая-то разница.
В отличие от производительности есть ли другая проблема с использованием подхода на основе домена? Пересмотренная версия функции уведомления домена может выглядеть так.
function domainAware(options, callback){
var d = domain.active || domain.create().on('error', function(err){ return callback(err); });
d.run(function(){
//Some Synchronous code that might throw an exception;
var a = {b: 1, c: 2};
var thing = JSON.stringify(a);
errorinAsync(null,d.intercept(function(err) {
return callback(null);
}));
});
}
Мне нравится простота доменной версии, но более или менее эквивалентна? Конечно, вам нужно помнить, что использовать d.intercept или проверять ошибки любых обратных вызовов, но я могу справиться с этим.
try catch только замедляет код вокруг него, поэтому попробуйте {doSomethingSlow()} НЕ замедлить вызванную функцию из-за обструкции оптимизации. – dandavis
@ dandavis, я сделал обновление, чтобы включить эквивалентную версию try catch. Я проведу тестирование производительности, чтобы увидеть, есть ли какая-либо разница – Sudsy