Es6系列之深入generator之异常处理与相互调用
2023-09-14 09:01:05 时间
上面的例子就是在generator里面增加try...catch语句来捕获函数内部的异常,然后generator本身也提供了一个方法用于向外抛出异常
throw 此方法可以向外抛出异常,由外部的try...catch来捕获
function * build(){ try{ yield haha; }catch(err){ console.log(inside error: + err); var it = build(); it.throw(from it); // = out error from it }catch(err){ console.log(out error: + err);
假如generator内部没有加上try...catch,然后内部有异常的话,则异常默认会向上抛出,像上面那样的话则可以捕获.
注意:上面generator里的异常捕获只支持同步方法调用
generator 间调用之前我们都是那一个generator来举例子,下面我们说说怎么在generator函数里调用别的,先上一个例子,然后我们说说它是怎么工作的吧
function* build(){ var a = yield 1; var b = yield 2; var c = yield* child(); console.log(a, b, c); function* child(){ var x = yield 3; var y = yield 4; console.log(x, y); return child; var it = new build(); it.next(); it.next(a); it.next(b); it.next(c); it.next(d); // = c d // = a b child
generator提供了yield*的语法来支持调用别的generator函数
yield* 后面跟上别的generator实例就可以遍历别的generator里的yield了
看到上面child里的return了没,这个跟普通调用generator不同的时,这个返回值默认会传递给yield*表达式,像上面那样然后给c本地变量赋值
普通yield表达式假如想有返回值的话,则只能依赖后续的next传递参数进来
上面的例子里只是写了一层调用,其实在child函数还可以调用别的generator函数,然后在里面产生的异常也会一层一层的传递到外面来的. 看下面的例子
function* build(){ var a = yield 1; var b = yield 2; try{ var c = yield* child(); }catch(err){ console.log(build error: + err); console.log(a, b, c, d); // = 此处会向上抛异常 d未定义 function* child(){ var x = yield 3; var y = yield 4; console.log(x, y, c); // = 此处会向上抛异常 c未定义 return child; var it = new build(); it.next(); it.next(a); it.next(b); it.next(c); it.next(d); }catch(err){ console.log(out error: + err); // = c d // = a b child
上面主要说了下generator关于同步操作下的异常处理,以及generator互相调用的问题,下一篇文章主要讲讲generator里调用异步方法的情况.
Clang Module 内部实现原理及源码分析 钉钉工程开始支持Swift,在适配clang module的过程中,遇到了各种各样的编译问题,为了弄清楚这些编译失败的真正原因,以及clang module的最佳实践,决定通过深入阅读clang module的实现代码,来解开这些谜团。
SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理 提到权限管理这块肯定很多人第一想到的就是Springboot Security或者是Shiro安全框架,但本文介绍的并不是这两种,不是因为他们不好用,实在是自己太懒了,我觉得一个拦截器加上其他的一些处理就能满足项目的需求,我又何必去多用一个框架呢,这篇文章也不是去对比谁好谁坏,各位自行抉择。