rename the task
This commit is contained in:
parent
c12ce5daff
commit
88732391b5
2 changed files with 86 additions and 0 deletions
|
@ -0,0 +1,43 @@
|
||||||
|
Разница в поведении станет очевидной, если рассмотреть код внутри функции.
|
||||||
|
|
||||||
|
Поведение будет различным, если управление каким-то образом выпрыгнет из `try..catch`.
|
||||||
|
|
||||||
|
Например, `finally` сработает после `return`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
...
|
||||||
|
*!*
|
||||||
|
return result;
|
||||||
|
*/!*
|
||||||
|
} catch (e) {
|
||||||
|
...
|
||||||
|
} finally {
|
||||||
|
очистить ресурсы
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Или же управление может выпрыгнуть из-за `throw`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
function f() {
|
||||||
|
try {
|
||||||
|
...
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
...
|
||||||
|
if(не умею обрабатывать эту ошибку) {
|
||||||
|
*!*
|
||||||
|
throw e;
|
||||||
|
*/!*
|
||||||
|
}
|
||||||
|
|
||||||
|
} finally {
|
||||||
|
очистить ресурсы
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
В этих случаях именно `finally` гарантирует выполнение кода до окончания работы `f`, просто код не будет вызван.
|
43
1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md
Normal file
43
1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# Finally или просто код?
|
||||||
|
|
||||||
|
[importance 5]
|
||||||
|
|
||||||
|
Сравните два фрагмента кода.
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Первый использует `finally` для выполнения кода по выходу из `try..catch`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
try {
|
||||||
|
начать работу
|
||||||
|
работать
|
||||||
|
} catch (e) {
|
||||||
|
обработать ошибку
|
||||||
|
} finally {
|
||||||
|
*!*
|
||||||
|
финализация: завершить работу
|
||||||
|
*/!*
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
</li>
|
||||||
|
<li>Второй фрагмент просто ставит очистку ресурсов за `try..catch`:
|
||||||
|
|
||||||
|
```js
|
||||||
|
try {
|
||||||
|
начать работу
|
||||||
|
} catch (e) {
|
||||||
|
обработать ошибку
|
||||||
|
}
|
||||||
|
|
||||||
|
*!*
|
||||||
|
финализация: завершить работу
|
||||||
|
*/!*
|
||||||
|
```
|
||||||
|
|
||||||
|
</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
Нужно, чтобы код финализации всегда выполнялся при выходе из блока `try..catch` и, таким образом, заканчивал начатую работу. Имеет ли здесь `finally` какое-то преимущество или оба фрагмента работают одинаково?
|
||||||
|
|
||||||
|
Если имеет, то дайте пример когда код с `finally` работает верно, а без -- неверно.
|
Loading…
Add table
Add a link
Reference in a new issue