diff --git a/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md b/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md new file mode 100644 index 00000000..5befa284 --- /dev/null +++ b/1-js/7-js-misc/5-exception/1-finally-or-code-after/solution.md @@ -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`, просто код не будет вызван. \ No newline at end of file diff --git a/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md b/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md new file mode 100644 index 00000000..5c93daf5 --- /dev/null +++ b/1-js/7-js-misc/5-exception/1-finally-or-code-after/task.md @@ -0,0 +1,43 @@ +# Finally или просто код? + +[importance 5] + +Сравните два фрагмента кода. + +
    +
  1. Первый использует `finally` для выполнения кода по выходу из `try..catch`: + +```js +try { + начать работу + работать +} catch (e) { + обработать ошибку +} finally { +*!* + финализация: завершить работу +*/!* +} +``` + +
  2. +
  3. Второй фрагмент просто ставит очистку ресурсов за `try..catch`: + +```js +try { + начать работу +} catch (e) { + обработать ошибку +} + +*!* +финализация: завершить работу +*/!* +``` + +
  4. +
+ +Нужно, чтобы код финализации всегда выполнялся при выходе из блока `try..catch` и, таким образом, заканчивал начатую работу. Имеет ли здесь `finally` какое-то преимущество или оба фрагмента работают одинаково? + +Если имеет, то дайте пример когда код с `finally` работает верно, а без -- неверно.