3030
3131![ ] ( try-catch-flow.svg )
3232
33- 所以,` try {...} ` 块内的错误不会杀死脚本 — 我们有机会在 ` catch ` 中处理它。
33+ 所以,` try {...} ` 块内的 error 不会杀死脚本 — — 我们有机会在 ` catch ` 中处理它。
3434
3535让我们来看一些例子。
3636
@@ -39,15 +39,15 @@ try {
3939 ``` js run
4040 try {
4141
42- alert (' Start of try runs ' ); // *!*(1) <--*/!*
42+ alert (' 开始执行 try 中的内容 ' ); // *!*(1) <--*/!*
4343
4444 // ...这里没有 error
4545
46- alert (' End of try runs ' ); // *!*(2) <--*/!*
46+ alert (' try 中的内容执行完毕 ' ); // *!*(2) <--*/!*
4747
4848 } catch (err) {
4949
50- alert (' Catch is ignored, because there are no errors ' ); // (3)
50+ alert (' catch 被忽略,因为没有 error ' ); // (3)
5151
5252 }
5353 ```
@@ -56,17 +56,17 @@ try {
5656 ` ` ` js run
5757 try {
5858
59- alert('Start of try runs '); // *!*(1) <--*/!*
59+ alert('开始执行 try 中的内容 '); // *!*(1) <--*/!*
6060
6161 *!*
62- lalala; // Error ,变量未定义!
62+ lalala; // error ,变量未定义!
6363 */!*
6464
65- alert('End of try (never reached) '); // (2)
65+ alert('try 的末尾(未执行到此处) '); // (2)
6666
6767 } catch (err) {
6868
69- alert(` Error has occurred ! ` ); // *!*(3) <--*/!*
69+ alert(` 出现了 error! ` ); // *!*(3) <--*/!*
7070
7171 }
7272 ` ` `
8181try {
8282 {{{{{{{{{{{{
8383} catch (err) {
84- alert("The engine can't understand this code, it's invalid ");
84+ alert("引擎无法理解这段代码,它是无效的 ");
8585}
8686` ` `
8787
@@ -91,7 +91,7 @@ JavaScript 引擎首先会读取代码,然后运行它。在读取阶段发生
9191````
9292
9393
94- ` ` ` ` warn header= " `try...catch` 同步工作 "
94+ ` ` ` ` warn header= " `try...catch` 同步执行 "
9595如果在“计划的(scheduled)”代码中发生异常,例如在 ` setTimeout` 中,则 ` try...catch` 不会捕获到异常:
9696
9797` ` ` js run
@@ -100,7 +100,7 @@ try {
100100 noSuchVariable; // 脚本将在这里停止运行
101101 }, 1000);
102102} catch (err) {
103- alert( "won't work " );
103+ alert( "不工作 " );
104104}
105105` ` `
106106
@@ -112,15 +112,15 @@ setTimeout(function() {
112112 try {
113113 noSuchVariable; // try...catch 处理 error 了!
114114 } catch {
115- alert( "error is caught here! " );
115+ alert( "error 被在这里捕获了! " );
116116 }
117117}, 1000);
118118` ` `
119119````
120120
121121## Error 对象
122122
123- 发生错误时,JavaScript 生成一个包含有关其详细信息的对象 。然后将该对象作为参数传递给 ` catch` :
123+ 发生错误时,JavaScript 会生成一个包含有关此 error 详细信息的对象 。然后将该对象作为参数传递给 ` catch` :
124124
125125` ` ` js
126126try {
@@ -155,8 +155,8 @@ try {
155155 alert(err.message); // lalala is not defined
156156 alert(err.stack); // ReferenceError: lalala is not defined at (...call stack)
157157
158- // 也可以将一个 error 作为整体显示出来as a whole
159- // Error 信息被转换为像 "name: message" 这样的字符串
158+ // 也可以将一个 error 作为整体显示出来
159+ // error 信息被转换为像 "name: message" 这样的字符串
160160 alert(err); // ReferenceError: lalala is not defined
161161}
162162` ` `
@@ -181,15 +181,15 @@ try {
181181
182182正如我们所知道的,JavaScript 支持 [JSON .parse (str)](mdn: js/ JSON / parse) 方法来解析 JSON 编码的值。
183183
184- 通常,它被用来解析从网络,从服务器或是从其他来源接收到的数据 。
184+ 通常,它被用来解析从网络、服务器或是其他来源接收到的数据 。
185185
186186我们收到数据后,然后像下面这样调用 ` JSON.parse` :
187187
188188` ` ` js run
189189let json = '{"name":"John", "age": 30}'; // 来自服务器的数据
190190
191191*!*
192- let user = JSON.parse(json); // 将文本表示转换成 JS 对象
192+ let user = JSON.parse(json); // 将文本表示转换成 JavaScript 对象
193193*/!*
194194
195195// 现在 user 是一个解析自 json 字符串的有自己属性的对象
@@ -213,21 +213,21 @@ let json = "{ bad json }";
213213try {
214214
215215*!*
216- let user = JSON.parse(json); // <-- 当出现一个 error 时...
216+ let user = JSON.parse(json); // <-- 当出现 error 时...
217217*/!*
218218 alert( user.name ); // 不工作
219219
220220} catch (err) {
221221*!*
222222 // ...执行会跳转到这里并继续执行
223- alert( "Our apologies, the data has errors, we'll try to request it one more time. " );
223+ alert( "很抱歉,数据有错误,我们会尝试再请求一次。 " );
224224 alert( err.name );
225225 alert( err.message );
226226*/!*
227227}
228228` ` `
229229
230- 在这儿,我们将 ` catch` 块仅仅用于显示信息,但是我们可以做更多的事儿 :发送一个新的网络请求,向访问者建议一个替代方案,将有关错误的信息发送给记录日志的设备,……。所有这些都比代码“死掉”好得多。
230+ 在这儿,我们将 ` catch` 块仅仅用于显示信息,但我们可以做更多的事 :发送一个新的网络请求,向访问者建议一个替代方案,将有关错误的信息发送给记录日志的设备,……。所有这些都比代码“死掉”好得多。
231231
232232## 抛出我们自定义的 error
233233
@@ -250,11 +250,11 @@ try {
250250}
251251` ` `
252252
253- 这里 ` JSON.parse` 正常执行,但是缺少 ` name` 属性对我们来说确实是个 error。
253+ 这里 ` JSON.parse` 正常执行,但缺少 ` name` 属性对我们来说确实是个 error。
254254
255255为了统一进行 error 处理,我们将使用 ` throw` 操作符。
256256
257- ### " Throw " 操作符
257+ ### " throw " 操作符
258258
259259` throw` 操作符会生成一个 error 对象。
260260
@@ -317,14 +317,14 @@ try {
317317
318318 if (!user.name) {
319319*!*
320- throw new SyntaxError("Incomplete data: no name"); // (*)
320+ throw new SyntaxError("数据不全:没有 name"); // (*)
321321*/!*
322322 }
323323
324324 alert( user.name );
325325
326326} catch(err) {
327- alert( "JSON Error: " + err.message ); // JSON Error: Incomplete data: no name
327+ alert( "JSON Error: " + err.message ); // JSON Error: 数据不全:没有 name
328328}
329329` ` `
330330
@@ -351,9 +351,9 @@ try {
351351}
352352` ` `
353353
354- 当然,一切皆有可能!程序员也会犯错。即使是被数百万人使用了几十年的开源项目中 — 也可能突然被发现了一个漏洞,并导致可怕的黑客入侵。
354+ 当然,一切皆有可能!程序员也会犯错。即使是被数百万人使用了几十年的开源项目中, 也可能突然被发现了一个漏洞,并导致可怕的黑客入侵。
355355
356- 在我们的例子中,` try...catch` 旨在捕获“数据不正确”的 error。但是实际上 ,catch 会捕获到 ** 所有** 来自于 ` try` 的 error。在这儿,它捕获到了一个预料之外的 error,但是仍然抛出的是同样的 ` "JSON Error"` 信息。这是不正确的,并且也会使代码变得更难以调试。
356+ 在我们的例子中,` try...catch` 旨在捕获“数据不正确”的 error。但实际上 ,catch 会捕获到 ** 所有** 来自于 ` try` 的 error。在这儿,它捕获到了一个预料之外的 error,但仍然抛出的是同样的 ` "JSON Error"` 信息。这是不正确的,并且也会使代码变得更难以调试。
357357
358358为了避免此类问题,我们可以采用“重新抛出”技术。规则很简单:
359359
@@ -390,7 +390,7 @@ try {
390390 let user = JSON.parse(json);
391391
392392 if (!user.name) {
393- throw new SyntaxError("Incomplete data: no name");
393+ throw new SyntaxError("数据不全:没有 name");
394394 }
395395
396396*!*
@@ -495,16 +495,16 @@ try {
495495
496496无论如何,` finally` 子句都是一个结束测量的好地方。
497497
498- 在这儿,` finally` 能够保证在两种情况下都能正确地测量时间 — 成功执行 ` fib` 以及 ` fib` 中出现 error 时:
498+ 在这儿,` finally` 能够保证在两种情况下都能正确地测量时间 —— 成功执行 ` fib` 以及 ` fib` 中出现 error 时:
499499
500500` ` ` js run
501- let num = +prompt("Enter a positive integer number? ", 35)
501+ let num = +prompt("输入一个正整数? ", 35)
502502
503503let diff, result;
504504
505505function fib(n) {
506506 if (n < 0 || Math.trunc(n) != n) {
507- throw new Error("Must not be negative, and also an integer. ");
507+ throw new Error("不能是负数,并且必须是整数。 ");
508508 }
509509 return n <= 1 ? n : fib(n - 1) + fib(n - 2);
510510}
@@ -521,12 +521,12 @@ try {
521521}
522522*/!*
523523
524- alert(result || "error occurred ");
524+ alert(result || "出现了 error ");
525525
526- alert( ` execution took ${diff}ms` );
526+ alert( ` 执行花费了 ${diff}ms` );
527527` ` `
528528
529- 你可以通过运行上面这段代码并在 ` prompt` 弹窗中输入 ` 35` 来进行检查 — 代码运行正常,先执行 ` try` 然后是 ` finally` 。如果你输入的是 ` -1` — 将立即出现 error,执行将只花费 ` 0ms` 。以上两种情况下的时间测量都正确地完成了。
529+ 你可以通过运行上面这段代码并在 ` prompt` 弹窗中输入 ` 35` 来进行检查 —— 代码运行正常,先执行 ` try` 然后是 ` finally` 。如果你输入的是 ` -1` — — 将立即出现 error,执行将只花费 ` 0ms` 。以上两种情况下的时间测量都正确地完成了。
530530
531531换句话说,函数 ` fib` 以 ` return` 还是 ` throw` 完成都无关紧要。在这两种情况下都会执行 ` finally` 子句。
532532
@@ -573,7 +573,7 @@ function func() {
573573 try {
574574 // ...
575575 } finally {
576- // 完成前面我们需要完成的那件事儿 ,即使 try 中的执行失败了
576+ // 完成前面我们需要完成的那件事 ,即使 try 中的执行失败了
577577 }
578578}
579579` ` `
@@ -601,7 +601,7 @@ window.onerror = function(message, url, line, col, error) {
601601` ` `
602602
603603` message`
604- : Error 信息。
604+ : error 信息。
605605
606606` url`
607607: 发生 error 的脚本的 URL 。
@@ -610,7 +610,7 @@ window.onerror = function(message, url, line, col, error) {
610610: 发生 error 处的代码的行号和列号。
611611
612612` error`
613- : Error 对象。
613+ : error 对象。
614614
615615例如:
616616
@@ -630,46 +630,46 @@ window.onerror = function(message, url, line, col, error) {
630630</script>
631631` ` `
632632
633- 全局错误处理程序 ` window.onerror` 的作用通常不是恢复脚本的执行 — 如果发生编程错误,那这几乎是不可能的 ,它的作用是将错误信息发送给开发者。
633+ 全局错误处理程序 ` window.onerror` 的作用通常不是恢复脚本的执行 —— 如果发生编程错误,恢复脚本的执行几乎是不可能的 ,它的作用是将错误信息发送给开发者。
634634
635- 也有针对这种情况提供错误日志的 Web 服务,例如 < https: // errorception.com> 或 <http://www.muscula.com>。
635+ 也有针对这种情况提供 error 日志的 Web 服务,例如 < https: // errorception.com> 或 <http://www.muscula.com>。
636636
637637它们会像这样运行:
638638
639- 1. 我们注册该服务,并拿到一段 JS 代码(或脚本的 URL ),然后插入到页面中。
640- 2. 该 JS 脚本设置了自定义的 ` window.onerror` 函数。
641- 3. 当发生 error 时,它会发送一个此 error 相关的网络请求到服务提供方。
639+ 1. 我们注册该服务,并拿到一段 JavaScript 代码(或脚本的 URL ),然后插入到页面中。
640+ 2. 该 JavaScript 脚本设置了自定义的 ` window.onerror` 函数。
641+ 3. 当发生 error 时,它会发送一个此 error 相关的网络请求到服务提供方。
6426424. 我们可以登录到服务方的 Web 界面来查看这些 error。
643643
644644## 总结
645645
646- ` try...catch` 结构允许我们处理执行过程中出现的 error。从字面上看,它允许“尝试”运行代码并“捕获”其中可能发生的错误 。
646+ ` try...catch` 结构允许我们处理执行过程中出现的 error。从字面上看,它允许“尝试”运行代码并“捕获”其中可能发生的 error 。
647647
648648语法如下:
649649
650650` ` ` js
651651try {
652652 // 执行此处代码
653653} catch (err) {
654- // 如果发生错误 ,跳转至此处
654+ // 如果发生 error ,跳转至此处
655655 // err 是一个 error 对象
656656} finally {
657657 // 无论怎样都会在 try/catch 之后执行
658658}
659659` ` `
660660
661- 这儿可能会没有 ` catch` 部分或者没有 ` finally` ,所以 ` try...catch` 或 ` try...finally` 都是可用的。
661+ 这儿可能会没有 ` catch` 或者没有 ` finally` ,所以 ` try...catch` 或 ` try...finally` 都是可用的。
662662
663663Error 对象包含下列属性:
664664
665- - ` message` — 人类可读的 error 信息。
666- - ` name` — 具有 error 名称的字符串(Error 构造器的名称)。
667- - ` stack` (没有标准,但得到了很好的支持)— Error 发生时的调用栈。
665+ - ` message` _ 人类可读的 error 信息。
666+ - ` name` —— 具有 error 名称的字符串(Error 构造器的名称)。
667+ - ` stack` (没有标准,但得到了很好的支持)—— Error 发生时的调用栈。
668668
669669如果我们不需要 error 对象,我们可以通过使用 ` catch {` 而不是 ` catch (err) {` 来省略它。
670670
671671我们也可以使用 ` throw` 操作符来生成自定义的 error。从技术上讲,` throw` 的参数可以是任何东西,但通常是继承自内建的 ` Error` 类的 error 对象。下一章我们会详细介绍扩展 error。
672672
673673再次抛出(rethrowing)是一种错误处理的重要模式:` catch` 块通常期望并知道如何处理特定的 error 类型,因此它应该再次抛出它不知道的 error。
674674
675- 即使我们没有 ` try...catch` ,大多数执行环境也允许我们设置“全局”错误处理程序来捕获 “掉出(fall out)”的 error。在浏览器中,就是 ` window.onerror` 。
675+ 即使我们没有 ` try...catch` ,大多数执行环境也允许我们设置“全局” error 处理程序来捕获 “掉出(fall out)”的 error。在浏览器中,就是 ` window.onerror` 。
0 commit comments