避免在Promise

时间:2015-05-29 22:08:36

标签: bluebird

对于bluebird,假设我想捕获错误并抛出不同的错误。

DAO.getById('AccessTokens', token).then(function(matchingToken) {
  return matchingToken;
}).catch(NotFoundError, function(err) {
  Logging.error("caught a not found error"); // or some kind of logger...
  throw err;
}).catch(function(err) {
  throw ['DB Error - Tokens', err];
});

如果我运行它并抛出NotFoundError,我会发现NotFoundError处理程序运行,然后运行通用错误处理程序。我想只有NotFoundError处理程序为NotFoundError运行/传播。

有没有办法捕获一些错误并传播它们而不会遇到catchall错误处理程序?

我可以删除catchall,但随后可能会传播未知错误。我可以在catchall中检查NotFoundErrors,但这似乎是重复行为..还有另一种选择吗?

1 个答案:

答案 0 :(得分:1)

不,但让我们谈谈为什么

目前 - 不,过去曾被考虑过,但目前用例还不够令人信服。 Petka Gorgi和我在IRC中讨论过这个问题并且普遍同意使用.catch(function(){(一个全部捕获)并不是最好的想法 - 不知道什么可能会失败是有问题的,通常如果你因为某个原因而失败了知道 - 你想重新启动服务器,因为不清楚你将如何恢复。

就个人而言,我只是删除了catch-all - 特别是因为它抛出了一些不是错误的东西(因此没有堆栈跟踪,这在调试方面存在问题并且恶化)。您可以全局记录错误并正常关闭。

我是成年人,你不是我的老板

很好,你说得对。图书馆对我认为良好的错误处理实践持主观态度。您的意见可能会有所不同,您可以按照自己喜欢的方式写下所有内容。可悲的是,我一整天都在编写Haskell编码,所以这看起来似乎有点功能 - 你可以随时捕捉所有类型中的类型:

function typeT(type){
    return function(item){ return item instanceof type; };
}
function not(fn){
    return function(){ return !(fn.apply(this, arguments); };
}

DAO.getById('AccessTokens', token).then(function(matchingToken) {
  return matchingToken;
}).catch(NotFoundError, function(err) {
  Logging.error("caught a not found error"); // or some kind of logger...
  throw err;
}).catch(not(typeT(NotFoundError)), function(err) { // predicate function catch clause
  throw ['DB Error - Tokens', err];
});