Чи виконається finally, якщо в try є return?
Це один з найчастіших "підводних каменів" у JavaScript!
Відповідь - так, блок finally завжди виконується, навіть якщо всередині try є return.
Загальне правило
Незалежно від того, чи була помилка, чи був return, чи був throw, блок
finallyгарантовано виконається перед виходом із функції.
Приклад 1. return усередині try
javascript
function test() {
try {
console.log("Всередині try");
return "Значення з try";
} finally {
console.log("Блок finally все одно виконається");
}
}
console.log("Результат:", test());Вивід:
javascript
Всередині try
Блок finally все одно виконається
Результат: Значення з tryВидно, що:
- Спочатку виконується код усередині
try. - Потім перед поверненням значення викликається
finally. - Лише після цього функція повертає результат.
Приклад 2. return і throw усередині try
javascript
function example() {
try {
console.log("Перед поверненням");
return "Повернення з try";
} catch {
console.log("catch не викличеться");
} finally {
console.log("finally все одно виконується");
}
}
console.log(example());Вивід:
javascript
Перед поверненням
finally все одно виконується
Повернення з tryПриклад 3. return і помилка: finally все одно спрацьовує
javascript
function example() {
try {
throw new Error("Помилка в try");
} catch (e) {
console.log("Впіймали:", e.message);
return "Повернення з catch";
} finally {
console.log("finally все одно виконується");
}
}
console.log(example());Вивід:
javascript
Впіймали: Помилка в try
finally все одно виконується
Повернення з catchПриклад 4. finally може перевизначити return
Якщо всередині finally теж є return,
він замінить результат, який повертався з try або catch.
javascript
function example() {
try {
return "З try";
} finally {
return "З finally";
}
}
console.log(example());Вивід:
javascript
З finallyТому додавати return у finally - погана практика,
бо це робить поведінку функції непередбачуваною.
Приклад 5. Навіть при помилці finally виконається
javascript
function example() {
try {
throw new Error("Помилка!");
} finally {
console.log("finally відпрацює навіть при помилці");
}
}
example(); // Uncaught Error: Помилка!Вивід:
javascript
finally відпрацює навіть при помилці
Uncaught Error: Помилка!Підсумок
| Сценарій | Виконається finally? | Що станеться |
|---|---|---|
| Помилок немає | Так | Після try |
| Є помилка | Так | Після catch |
Є return у try | Так | Перед виходом із функції |
Є return у catch | Так | Перед виходом із функції |
Є throw | Так | Перед викидом винятку |
Є return у finally | Так, і перезапише результат |
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.