Метод ES6: iterator.throw(err)
часто описывается как внедрение исключения, как если бы оно произошло в операторе yield
в генераторе. Проблема заключается в том, что трассировка стека для этого исключения не содержит ссылки на файл/строку для оператора yield или даже на функцию, в которой он находится. Скорее, трассировка стека создается только при создании объекта исключения, которого нет внутри generator
.
Вопрос заключается в следующем: как я могу получить местоположение ошибочного оператора yield в трассировке стека или иным образом?
function* one_of_many_generators() {
// ...
yield ajax(url); // <-- what I need in the stack trace
// ...
}
function outer() {
var iterator = one_of_many_generators();
iterator.next(); // runs to the first yield
// inject exception at the yield statement
iterator.throw(Error("error")); // <-- top of stack trace shows here
}
Хотя эта проблема не относится только к Promises
, они могут облегчить картину проблемы. В моем случае я использую систему задач с генераторами и обещаниями. Гипотетическая функция ajax()
возвращает Promise, и если она отклонена, ошибка преобразуется в throw в операторе yield с использованием этого механизма.
Трассировки стека в отладчике довольно бесполезны, потому что я не могу найти способ получить функцию, файл или номер строки для yield statement
где происходит это внедрение. Вызов iterator.throw(err)
обрабатывается как rethrow и не получает новую информацию о стеке, поэтому он показывает только местоположение внутри функции ajax()
которую можно вызывать из многих мест, и выдает новую ошибку в outer()
как в примере выше, одна и та же строка броска показывает для всех ошибок. Ни один из них не дает подсказки о том, какая функция generator
выполнялась для отладки ошибки.
Я использую Chrome v42.