rename the task

This commit is contained in:
Ilya Kantor 2015-06-11 18:23:02 +03:00
parent c12ce5daff
commit 88732391b5
2 changed files with 86 additions and 0 deletions

View file

@ -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`, просто код не будет вызван.

View 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` работает верно, а без -- неверно.