使用生成器进行异常处理
exception handling with generators
本文关键字:异常处理 更新时间:2023-09-26
所以最近生成器在 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来自蓝鸟)
注意到错误了吗?但是,存在一个引用错误 - 捕获会吞噬它。
当我在 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
}
根据最新的 ES6 生成器草案,您可以调用生成器的"throw"函数来恢复生成器并出现抛出错误。
例如:
function procrastinatingAdd(x, y) {
var errMsg = "Expected number and got ";
setTimeout(function() {
if (isNaN(x)) gen.throw(new TypeError(errMsg + typeof x));
if (isNaN(y)) gen.throw(new TypeError(errMsg + typeof y));
gen.next(x + y);
}, 500);
}
var gen = function* () {
try {
var result = yield procrastinatingAdd(1, "foo");
log(result);
}
catch (e) {
log(e);
}
};
gen = gen();
gen.next();
大概你用来管理生成器内流量控制的任何库(我没有研究过 Promises,但像 genny 和 gen-run 这样的库)应该为你处理这个问题,这样你正在使用的库就不需要是生成器感知的。
相关文章:
- node.js和express中的异常处理
- JavaScript 异常处理未按预期工作
- tomcat服务器停止时UI上的异常处理
- 带异常处理的基数转换
- Javascript getJson异常处理
- 使用生成器进行异常处理
- 如何在保留 JavaScript 调试器功能的同时进行优雅的异常处理
- 了解 JavaScript 中的异常处理:当更改 try/catch 块的位置时,获得不同的输出
- 流星中的异常处理
- 角.如何在视图中显示异常处理程序的错误
- 如何使工作 Chrome 扩展程序的未捕获异常处理程序(由于 CORS 保护而不起作用)
- Selenium2/WebdriverJavaScript异常处理:错误消息大部分时间为空(Javaneneneba A
- 使用bluebird promise进行异步异常处理
- Vert-x 3.3.2 HTTP客户端异常处理程序
- Node.js最佳实践异常处理-异步/Await之后
- 异常处理程序不捕获异常
- NodeJS中的嵌套回调和异常处理
- React Native - `require()`语句异常处理
- 如何实现对importScripts()的异常处理
- 我想在Javascript/Jquery函数中使用异常处理