Skip to content

Commit 8b7dc39

Browse files
authored
fix: 优化 try...catch... 章节的翻译
1 parent 291a79a commit 8b7dc39

File tree

1 file changed

+48
-48
lines changed

1 file changed

+48
-48
lines changed

1-js/10-error-handling/1-try-catch/article.md

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ try {
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
```
@@ -81,7 +81,7 @@ try {
8181
try {
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
126126
try {
@@ -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
189189
let 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 }";
213213
try {
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
503503
let diff, result;
504504
505505
function 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 相关的网络请求到服务提供方。
642642
4. 我们可以登录到服务方的 Web 界面来查看这些 error。
643643

644644
## 总结
645645

646-
`try...catch` 结构允许我们处理执行过程中出现的 error。从字面上看,它允许“尝试”运行代码并“捕获”其中可能发生的错误
646+
`try...catch` 结构允许我们处理执行过程中出现的 error。从字面上看,它允许“尝试”运行代码并“捕获”其中可能发生的 error
647647

648648
语法如下:
649649

650650
```js
651651
try {
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

663663
Error 对象包含下列属性:
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

Comments
 (0)