try - блок коду, у якому може статися помилка. catch - що робити, якщо вона сталася. finally - що виконати в будь-якому разі.
function loadSettings() {
try {
const raw = localStorage.getItem('settings');
return JSON.parse(raw) ?? {};
} catch (error) {
console.warn('Пошкоджені налаштування, використовуємо типові', error);
return {};
} finally {
hideLoader(); // виконається і при успіху, і при помилці
}
}
Як це працює:
- коли в
tryкидається виняток, решта блоку пропускається і керування переходить уcatch; - у
catchдоступний об'єкт помилки:error.name,error.message,error.stack; - якщо помилки не було,
catchне виконується; finallyвиконується завжди - навіть якщо вtryчиcatchбувreturnчи нова помилка.
Змінна в catch необов'язкова:
try {
JSON.parse(input);
} catch {
showError('Некоректний JSON');
}
Кинути власну помилку - throw:
if (!email.includes('@')) {
throw new Error('Некоректна електронна адреса');
}
Кидати варто об'єкти Error (або нащадки), а не рядки: throw 'помилка' не має стеку викликів, і налагоджувати таке набагато важче.
Типові помилки новачків:
- ловити все й мовчати:
catch (e) {}- помилка зникла, а програма працює з неправильними даними. Як мінімум - записати в лог; - занадто великий
try: обгорнути всю функцію, а потім не розуміти, який рядок кинув виняток. Краще обгортати лише те, що справді може впасти і що ви знаєте, як обробити; - очікувати, що
tryзловить помилку в колбекуsetTimeoutчи обробнику події - не зловить, бо колбек виконується пізніше, колиtryуже завершено; - асинхронний код без
await:try { fetchData() } catchне зловить відхилений Promise. Потрібноtry { await fetchData() } catch.
finally для прибирання: зняти індикатор завантаження, розблокувати кнопку, закрити з'єднання - те, що має статися незалежно від результату.