Generator函数返回的遍历器对象都有一个throw方法,可以在函数体外抛出错误,但在函数体内被捕获。
-
Generator内部部署了try/catch语块,那么遍历器throw方法抛出的错误不影响下一次的遍历。
-
如果没有部署函数体内的try/catch语句,那么抛出的错误一律由函数体外的try/catch处理
-
若外部也没有部署try/catch代码块,程序报错,终端执行,结束遍历。
-
一旦执行Generator过程中抛出错误,就不会再执行下去了,此后继续调用next()方法将返回value:undefined ,done:true的对象,即JavaScript认为该generator已经运行结束。
-
throw方法执行一次会自动执行吓一跳yield表达式,相当于执行了一次next()方法。
内部捕获:
let g = function* () {
try {
yield;
}
catch (e) {
console.log('内部捕获', e);
}
};
let i = g();
i.next();
try {
i.throw('a');//内部捕获
i.throw("b");//外部捕获,Generator函数体内的catch已经执行过了,被函数体外捕获
} catch (e) {
console.log("外部捕获:", e)
}
注意:不能混淆throw方法和全局的throw命令
全局的throw命令只能用Generator函数体外的try/catch语句捕获
throw方法:
Generator函数调用
i.throw()
throw命令:
throw new Error('a')
抛出一个“异常”
外部捕获
let g = function* () {
try {
yield;
}
catch (e) {
console.log('内部捕获', e);
}
};
let i = g();
i.next();
try {
throw new Error('a');//全局throw命令只能外部捕获
throw new Error('b');
} catch (e) {
console.log('外部捕获:', e)
}
只捕获到一个的原因:函数体外的catch捕获了抛出的a错误后,就不会再执行try语块了。