Skip to content

Commit 8873239

Browse files
committed
rename the task
1 parent c12ce5d commit 8873239

2 files changed

Lines changed: 86 additions & 0 deletions

File tree

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
Разница в поведении станет очевидной, если рассмотреть код внутри функции.
2+
3+
Поведение будет различным, если управление каким-то образом выпрыгнет из `try..catch`.
4+
5+
Например, `finally` сработает после `return`:
6+
7+
```js
8+
function f() {
9+
try {
10+
...
11+
*!*
12+
return result;
13+
*/!*
14+
} catch (e) {
15+
...
16+
} finally {
17+
очистить ресурсы
18+
}
19+
}
20+
```
21+
22+
Или же управление может выпрыгнуть из-за `throw`:
23+
24+
```js
25+
function f() {
26+
try {
27+
...
28+
29+
} catch (e) {
30+
...
31+
if(не умею обрабатывать эту ошибку) {
32+
*!*
33+
throw e;
34+
*/!*
35+
}
36+
37+
} finally {
38+
очистить ресурсы
39+
}
40+
}
41+
```
42+
43+
В этих случаях именно `finally` гарантирует выполнение кода до окончания работы `f`, просто код не будет вызван.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Finally или просто код?
2+
3+
[importance 5]
4+
5+
Сравните два фрагмента кода.
6+
7+
<ol>
8+
<li>Первый использует `finally` для выполнения кода по выходу из `try..catch`:
9+
10+
```js
11+
try {
12+
начать работу
13+
работать
14+
} catch (e) {
15+
обработать ошибку
16+
} finally {
17+
*!*
18+
финализация: завершить работу
19+
*/!*
20+
}
21+
```
22+
23+
</li>
24+
<li>Второй фрагмент просто ставит очистку ресурсов за `try..catch`:
25+
26+
```js
27+
try {
28+
начать работу
29+
} catch (e) {
30+
обработать ошибку
31+
}
32+
33+
*!*
34+
финализация: завершить работу
35+
*/!*
36+
```
37+
38+
</li>
39+
</ol>
40+
41+
Нужно, чтобы код финализации всегда выполнялся при выходе из блока `try..catch` и, таким образом, заканчивал начатую работу. Имеет ли здесь `finally` какое-то преимущество или оба фрагмента работают одинаково?
42+
43+
Если имеет, то дайте пример когда код с `finally` работает верно, а без -- неверно.

0 commit comments

Comments
 (0)