Так недавно генераторы вступили в 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;
});
Теперь генераторы являются удивительными, поскольку они позволяют мне делать async/await в 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)
Обратите внимание на ошибку? Однако есть ссылочная ошибка - улов проглотит ее.
Когда я помещаю try/catch в 95% случаев, то, что я хочу поймать, это логические ошибки и ошибки ввода-вывода, а не синтаксис или ошибки типа. Я хочу очень хорошо знать об этом. Обратные вызовы используют первый параметр err
, а в генераторах я не уверен, что такое замена.
Как мне работать с обработкой исключений в коде генератора в JavaScript?
Хорошее решение позволило бы мне сохранить следы стека.