2015-11-05 75 views
2

我在node.js中使用Promises(使用Q库)。我已将所有基于回调的代码移植到Promises,并且一切都很顺利。然而,我认为有一种模式似乎继续执行,而我发现这种模式是可疑的。我觉得可能有更好的方法来处理这个问题,但我并不确定是什么。你如何有选择地处理Javascript承诺中的错误?

基本上,如果您有可能从异步操作中获取错误,并且您可能或可能无法在本地处理它。例如,处理某种类型的错误,并传播其余的错误。在基于回调的代码,我会做这样的事情:

fs.readFile(path, 'utf-8', function (err, data) { 
    if(err) { 
     if(err.code == "ENOENT") { 
      cb(null, null); //it's fine to return null and eat the error 
     } else { 
      cb(err, null); //this is probably not fine, so barf 
     } 
     return; 
    } 
    ... 
}); 

在基于无极代码,这将成为:

return fs.readFile(path, 'utf-8').then(function(data) { ... }, function(err) { 
    if(err.code == "ENOENT") { 
     return null; //it's fine to return null and eat the error 
    } 
    throw err; //this is probably not fine, so barf 
}); 

我不喜欢的部分是错误的再次抛。我来自.NET的背景,并且在那里重新抛出这样的异常基本上是一个可燃的进攻。但是,也许在JavaScript中并不重要?或者,有没有办法编写我不知道的代码?

+0

为什么'一个fireable进攻重新抛出在.NET中是这样的例外吗? – Jeff

+0

因为它吹掉了原始的堆栈跟踪,因为它设置在'throw',而不是'new' –

+0

我不喜欢承认任何Java优于C#的优势,但是当Tomcat出现异常时,它会显示第二/第三如果异常具有getCause()条目,则堆栈跟踪。 – Katana314

回答

2

也许在JavaScript中无所谓?

事实上,没关系。重新思考并不是一个坏习惯,堆栈跟踪(如果可以在异步环境中使用)不会受到影响。

JS没有办法根据它们的类型有条件地捕获异常,你总是必须抓住它们。一些承诺库,Bluebird specifically,虽然提供错误模式匹配的语法糖。

有没有办法写这段代码,我不知道?

如果你不喜欢throw关键字,或担心,这影响到了异常对象(它不应该),你可以使用等效

return Promise.reject(err); 
+0

好的,很高兴知道这并不重要! –