Generator函数throw详解

Generator函数返回的遍历器对象都有一个throw方法,可以在函数体外抛出错误,但在函数体内被捕获。

  1. Generator内部部署了try/catch语块,那么遍历器throw方法抛出的错误不影响下一次的遍历。

  2. 如果没有部署函数体内的try/catch语句,那么抛出的错误一律由函数体外的try/catch处理

  3. 若外部也没有部署try/catch代码块,程序报错,终端执行,结束遍历。

  4. 一旦执行Generator过程中抛出错误,就不会再执行下去了,此后继续调用next()方法将返回value:undefined ,done:true的对象,即JavaScript认为该generator已经运行结束。

  5. 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语块了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值