我正在尝试提出一种处理 NodeJS 中异常的通用(自以为是)方法,由于性能下降,该方法不使用 try catch。我也想远离像 streamline 这样试图使异步代码看起来像同步代码的库。
似乎域很符合要求,但我想就我提议的使用方式征求意见/建议。这种方法是否存在重大问题?
我计划让我的大部分异步函数遵循以下 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
使用 try catch 的等效函数可能是:
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 或检查任何回调的错误,但我可以处理。