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

Власні класи помилок

📖 Теорія

Розширення Error для доменних помилок застосунку:

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

                            
📝 ЗАВДАННЯ (3)
1.
Завдання 1: Власний клас помилки
10 XP
Створи клас HttpError extends Error з:
- constructor(statusCode, message)
- властивість statusCode
- toString() → 'HTTP [code]: [message]'

Виведи toString() для:
new HttpError(404, 'Not Found')
new HttpError(500, 'Server Error')
💡 Підказка: super(message) в constructor, this.statusCode = statusCode
🔓 Розв'язок:
class HttpError extends Error {
  constructor(statusCode, message) {
    super(message);
    this.name = 'HttpError';
    this.statusCode = statusCode;
  }
  toString() { return `HTTP ${this.statusCode}: ${this.message}`; }
}
console.log(new HttpError(404, 'Not Found').toString());
console.log(new HttpError(500, 'Server Error').toString());
Вивід:

                                

2.
Завдання 2: Ієрархія помилок
20 XP
Створи:
class DatabaseError extends Error { constructor(query, message) }
class ConnectionError extends DatabaseError { constructor(host) }

Виклич і обробни обидва типи в try/catch, виведи instance checks:
databaseError instanceof DatabaseError → true
connectionError instanceof DatabaseError → true
connectionError instanceof ConnectionError → true
💡 Підказка: ConnectionError extends DatabaseError. super() в кожному конструкторі
🔓 Розв'язок:
class DatabaseError extends Error {
  constructor(query, message) {
    super(message);
    this.name = 'DatabaseError';
    this.query = query;
  }
}
class ConnectionError extends DatabaseError {
  constructor(host) {
    super(null, `Не вдалось підключитись до ${host}`);
    this.name = 'ConnectionError';
    this.host = host;
  }
}
const dbErr = new DatabaseError('SELECT *', 'Синтаксична помилка');
const connErr = new ConnectionError('localhost');
console.log(dbErr instanceof DatabaseError);
console.log(connErr instanceof DatabaseError);
console.log(connErr instanceof ConnectionError);
Вивід:

                                

3.
Завдання 3: Result pattern
30 XP
Реалізуй функціональний підхід без throw — Result pattern:

function ok(value) { return { success: true, value }; }
function err(error) { return { success: false, error }; }

Напиши функцію safeDivide(a, b) що повертає ok(a/b) або err('Ділення на нуль').
Напиши функцію safeParseInt(str) що повертає ok(число) або err('Не число').

Виведи результати для: safeDivide(10, 2), safeDivide(5, 0), safeParseInt('42'), safeParseInt('abc').
💡 Підказка: isNaN(parseInt(str)) для перевірки числа
🔓 Розв'язок:
const ok = value => ({ success: true, value });
const err = error => ({ success: false, error });

function safeDivide(a, b) {
  if (b === 0) return err('Ділення на нуль');
  return ok(a / b);
}

function safeParseInt(str) {
  const n = parseInt(str);
  if (isNaN(n)) return err('Не число');
  return ok(n);
}

const results = [safeDivide(10,2), safeDivide(5,0), safeParseInt('42'), safeParseInt('abc')];
results.forEach(r => {
  if (r.success) console.log('OK:', r.value);
  else console.log('ERR:', r.error);
});
Вивід: