Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Як створити власний тип помилки?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)Власний тип помилки створюють, розширюючи вбудований клас **`Error`** через `class MyError extends Error`, передаючи `message` (і за потреби `cause`) у `super()` та встановлюючи `this.name` і власні поля на кшталт `code`. **Ключове:** такий підхід зберігає `stack`, ланцюжок `cause` і коректно працює з `instanceof`.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення## Базовий шаблон (ES2022+) ```javascript class AppError extends Error { constructor(message, { code, cause } = {}) { super(message, { cause }); // зберігає stack і cause this.name = this.constructor.name; // "AppError" this.code = code ?? "APP_ERROR"; if (Error.captureStackTrace) { Error.captureStackTrace(this, this.constructor); } } } // Окремі випадки class ValidationError extends AppError { constructor(message, details, opts = {}) { super(message, { ...opts, code: "VALIDATION_ERROR" }); this.details = details; // будь-які власні поля } } class AuthError extends AppError { constructor(message = "Unauthorized", opts = {}) { super(message, { ...opts, code: "AUTH_ERROR" }); this.status = 401; } } ``` Використання: ```javascript function parseUser(input) { if (!input.email) { throw new ValidationError("Email обов'язковий", { field: "email" }); } return input; } try { parseUser({}); } catch (e) { if (e instanceof ValidationError) { console.log(e.code, e.details); // VALIDATION_ERROR { field: "email" } } else { console.error("Неочікувана помилка", e); } } ``` ## Обгортка вихідної помилки (`cause`) Корисно при перехопленні низькорівневих винятків: ```javascript try { JSON.parse("невалідний JSON"); } catch (e) { throw new AppError("Не вдалося розібрати конфіг", { cause: e, code: "CONFIG_PARSE" }); } ``` Пізніше можна подивитися ланцюжок: ```javascript console.error(err.cause); // вихідна помилка ``` ## Версія для TypeScript ```javascript type AppErrorCode = "APP_ERROR" | "VALIDATION_ERROR" | "AUTH_ERROR"; class AppError extends Error { code: AppErrorCode; declare cause?: unknown; // щоб TS знав про cause constructor(message: string, opts: { code?: AppErrorCode; cause?: unknown } = {}) { super(message, { cause: opts.cause }); this.name = new.target.name; this.code = opts.code ?? "APP_ERROR"; if ((Error as any).captureStackTrace) { (Error as any).captureStackTrace(this, new.target); } } } class ValidationError extends AppError { details?: Record<string, unknown>; constructor(message: string, details?: Record<string, unknown>, opts: { cause?: unknown } = {}) { super(message, { ...opts, code: "VALIDATION_ERROR" }); this.details = details; } } ``` ## Кілька практичних прийомів - **Серіалізація** (логування/відповідь API): ```javascript function errorToJson(err) { return { name: err.name, message: err.message, code: err.code, stack: err.stack, details: err.details, cause: err.cause instanceof Error ? err.cause.message : err.cause, }; } ``` - **HTTP-прив'язка**: Додайте `status` (400/401/404/500) у свої помилки і на рівні middleware мапте їх на відповіді. - **Гарантуйте** `instanceof`: Сучасні рушії окей, але шаблон з `extends Error` + `captureStackTrace` (якщо є) - надійна база.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.