最近NodeJS中推出了生成器函数,我现在可以这样做:
Promise.coroutine(function *(query){
var handle = yield db.connect(Settings.connectionString); //async, returns promise
var result = yield db.query(query); // async, returns promise
return result;
});
现在生成器非常棒,因为它们让我在JS中使用异步/等待。我真的很喜欢能够做到这一点。
然而,一个问题出现了。生成器与try / catch块一起使用,所以假设我有像这样的代码:
Promise.coroutine(function *(){
try{
var db = yield DBEngine.open("northwind"); // returns promise
var result = yield db.query("SELECT name FROM users"); // returns promise
return res;
} catch (e){
//code to handle exception in DB query
}
});
(注意,Promise.coroutine来自bluebird)
注意到问题了吗?有一个引用错误,但是catch会将其吞掉。
在大多数情况下,当我使用try/catch时,我想要捕获的是逻辑错误和I/O错误,而不是语法或类型错误。我想要非常非常地注意这些错误。回调函数使用一个err
作为第一个参数,在生成器中我不确定替代方法是什么。
如何在JavaScript的生成器代码中处理异常?
一个好的解决方案应该允许我保留堆栈跟踪。