From 2d86fc3f9c1302bf1c6926bb8ff41e2d25b8e5c1 Mon Sep 17 00:00:00 2001
From: ruanyf <yifeng.ruan@gmail.com>
Date: Thu, 17 May 2018 22:39:21 +0800
Subject: [PATCH] docs(generator): edit throw

---
 docs/generator.md | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/docs/generator.md b/docs/generator.md
index fde9a98..89127cf 100644
--- a/docs/generator.md
+++ b/docs/generator.md
@@ -534,6 +534,24 @@ g.throw();
 
 上面代码中,`g.throw`抛出错误以后,没有任何`try...catch`代码块可以捕获这个错误,导致程序报错,中断执行。
 
+`throw`方法抛出的错误要被内部捕获,前提是必须至少执行过一次`next`方法。
+
+```javascript
+function* gen() {
+  try {
+    yield 1;
+  } catch (e) {
+    console.log('内部捕获');
+  }
+}
+
+var g = gen();
+g.throw(1);
+// Uncaught 1
+```
+
+上面代码中,`g.throw(1)`执行时,`next`方法一次都没有执行过。这时,抛出的错误不会被内部捕获,而是直接在外部抛出,导致程序出错。这种行为其实很好理解,因为第一次执行`next`方法,等同于启动执行 Generator 函数的内部代码,否则 Generator 函数还没有开始执行,这时`throw`方法抛错只可能抛出在函数外部。
+
 `throw`方法被捕获以后,会附带执行下一条`yield`表达式。也就是说,会附带执行一次`next`方法。
 
 ```javascript