javascript - 生成器的异常处理

标签 javascript generator ecmascript-harmony

最近 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/

相关文章:

javascript - Angular - 来自 Controller 对象的 ng-init 复选框值

javascript - Webpack 中的输出文件名未配置错误

c# - 什么是 C# 迭代器和生成器,我该如何使用它们

python - 在Python类中使用__iter__方法实现递归函数

python - Python 生成器函数中的代码重复

javascript - 类型错误 : this is undefined

javascript - 使用 Jquery 停止 Vimeo 视频

javascript - 返回包含另一个函数的对象列表的函数

javascript - String.contains 是 JavaScript 中的标准函数吗?

node.js - ~~ Javascript 运算符