JavaScript: Обробка помилок

try/catch/finally та типи помилок

📖 Теорія

Помилки в JS — об'єкти класу Error або його нащадків.

Вбудовані типи помилок:
• Error — базовий клас
• SyntaxError — помилка синтаксису (парсинг JS)
• ReferenceError — звернення до неіснуючої змінної
• TypeError — неправильний тип (null.property)
• RangeError — значення поза межами (new Array(-1))
• URIError — помилка URI
• EvalError — помилка eval()

try {

💡 Приклад коду
Вивід:

                            
📝 ЗАВДАННЯ (3)
1.
Завдання 1: try/catch з JSON
10 XP
Напиши функцію safeParseJSON(str) яка:
- намагається розпарсити JSON-рядок
- при помилці повертає null та виводить повідомлення 'Невалідний JSON: [message]'

Виведи результати для:
1. '{"name":"Іван","age":30}'
2. 'не JSON'
💡 Підказка: JSON.parse кидає SyntaxError при невалідному рядку
🔓 Розв'язок:
function safeParseJSON(str) {
  try {
    return JSON.parse(str);
  } catch (e) {
    console.log(`Невалідний JSON: ${e.message}`);
    return null;
  }
}
console.log(safeParseJSON('{"name":"Іван","age":30}'));
console.log(safeParseJSON('не JSON'));
Вивід:

                                

2.
Завдання 2: Валідація з throw
20 XP
Напиши функцію validateAge(age) яка:
- кидає TypeError якщо age не число
- кидає RangeError якщо age < 0 або > 150
- повертає 'Валідний вік: [age]' якщо все ок

Обгорни виклики в try/catch і виведи результати для: 25, -5, 200, 'abc'.
💡 Підказка: throw new TypeError(...), throw new RangeError(...)
🔓 Розв'язок:
function validateAge(age) {
  if (typeof age !== 'number') throw new TypeError('Вік має бути числом');
  if (age < 0 || age > 150) throw new RangeError('Вік поза межами 0-150');
  return `Валідний вік: ${age}`;
}
for (const v of [25, -5, 200, 'abc']) {
  try { console.log(validateAge(v)); }
  catch (e) { console.log(`${e.constructor.name}: ${e.message}`); }
}
Вивід:

                                

3.
Завдання 3: finally та cleanup
30 XP
Напиши функцію processData(data) яка:
1. Виводить 'Починаємо обробку'
2. Якщо data === null — кидає Error('Дані відсутні')
3. Якщо data.length < 3 — кидає RangeError('Замало даних')
4. Повертає `Оброблено ${data.length} елементів`
5. В блоці finally завжди виводить 'Обробку завершено'

Виклич з [1,2,3,4], [], null.
💡 Підказка: try { ... } catch(e) { console.log(e.message) } finally { console.log('Обробку завершено') }
🔓 Розв'язок:
function processData(data) {
  console.log('Починаємо обробку');
  try {
    if (data === null) throw new Error('Дані відсутні');
    if (data.length < 3) throw new RangeError('Замало даних');
    return `Оброблено ${data.length} елементів`;
  } catch (e) {
    console.log(e.message);
  } finally {
    console.log('Обробку завершено');
  }
}
console.log(processData([1,2,3,4]));
processData([]);
processData(null);
Вивід: