最近 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 block ,假设我有如下代码:
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 会吞下它。
当我在 95% 的情况下使用 try/catch 时,我想要捕获的是逻辑错误和 I/O 错误,而不是语法或类型错误。我想非常非常了解这些。回调使用 err
第一个参数,在生成器中我不确定替代品是什么。
如何处理 JavaScript 生成器代码中的异常处理?
一个好的解决方案可以让我保留堆栈跟踪。
最佳答案
所以基本上这与异步系统无关,而是与特定的错误处理有关。尝试这样的事情:
var global_error_check = function(e) {
if (e && e.name === "ReferenceError") {
throw e;
}
// put other error types here that you don't want to catch
}
try {
...
} catch(e) {
global_error_check(e);
// handle other errors here
}
关于javascript - 生成器的异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19859451/