Помилки корисно повідомляти, коли в програмі або фрагменті коду щось іде не так або стається несподіване.
Це обʼєкти JavaScript.
Головна властивість цього обʼєкта - message:
const error = new Error('Oops, something went wrong');
console.log(error.message);
// => "Oops, something went wrong"
За допомогою синтаксису throw можна викинути помилку.
throw new Error('Oops');
Коли помилку викинуто, поточне виконання зупиняється й відновлюється в першому блоці catch стека викликів.
try {
throw new Error('Oops');
} catch (error) {
console.log(error.message);
// => "Oops"
}
Наслідування - це спосіб створювати звʼязки «батько-дитина» між класами. Дочірній клас (його іноді називають підкласом) має доступ до поведінки та даних, визначених батьківським класом (його іноді називають надкласом).
class Pet {
constructor(name) {
this.name = name;
}
introduce() {
console.log(`This is my pet, ${this.name}.`);
}
}
class Dog extends Pet {}
const dog = new Dog('Otis');
dog.introduce();
// => This is my pet, Otis.
Ключове слово extends в оголошенні дочірнього класу встановлює звʼязок із батьківським класом через ланцюжок прототипів.
Обʼєкти, створені конструктором дочірнього класу, матимуть прототип батьківського класу у своєму ланцюжку прототипів, що дає доступ до будь-яких методів чи даних, визначених батьком.
const dog = new Dog('Otis');
Dog.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(dog); // => true
Pet.prototype.isPrototypeOf(Dog.prototype); // => true
Pet.prototype.hasOwnProperty('introduce'); // => true
Dog.prototype.hasOwnProperty('introduce'); // => false
dog.hasOwnProperty('introduce'); // => false
Як і будь-який клас у JavaScript, підкласи можуть успадковуватися від Error, щоб створювати власні помилки за допомогою ключового слова extends.
Синтаксис instanceof перевіряє, чи є спіймана помилка екземпляром конкретного підкласу Error.
class CustomError extends Error {}
try {
// ... Code that may throw an error
} catch (error) {
if (error instanceof CustomError) {
console.log('The error thrown is an instance of the CustomError');
}
}
Елена - нова менеджерка із якості на фабриці газет. Оскільки вона тільки-но прийшла в компанію, то вирішила переглянути деякі процеси на фабриці й подивитися, що можна покращити. Вона зʼясувала, що техніки виконують багато перевірок якості вручну. Вона бачить у цьому хорошу можливість для автоматизації й просить нас як розробника-фрилансера написати програму для моніторингу деяких машин.
Перше завдання - написати програму для моніторингу рівня вологості у виробничому приміщенні. До програмного забезпечення компанії вже підʼєднано датчик, який періодично повертає відсоток вологості в приміщенні.
Потрібно реалізувати в програмі функцію, яка викидатиме помилку, якщо відсоток вологості занадто високий.
Функція повинна називатися checkHumidityLevel і приймати відсоток вологості як параметр.
Якщо відсоток перевищує 70%, потрібно викинути помилку (повідомлення не має значення).
checkHumidityLevel(60);
// => undefined
checkHumidityLevel(100);
// Throws an error
Елена дуже задоволена нашим першим завданням і просить нас зайнятися моніторингом температури машин. Під час розмови з техніком Грегом ми дізнаємося, що якщо температура машини перевищує 500°C, техніки починають хвилюватися через перегрів.
Машина оснащена датчиком, який вимірює її внутрішню температуру. Треба знати, що датчик дуже чутливий і часто ламається. У цьому випадку технікам потрібно буде його замінити.
Наше завдання - реалізувати функцію reportOverheating, яка приймає температуру як параметр і викидає помилку, якщо датчик зламався або якщо машина починає перегріватися.
Оскільки згодом нам потрібно буде реагувати на помилки по-різному, потрібен механізм, щоб розрізняти ці два види помилок.
Можна було б покладатися на повідомлення про помилки, але це зробило б наш код крихким: він зламається, якщо повідомлення зміниться.
Тож щоб зробити все правильно, ми будемо викидати екземпляри різних класів помилок.
null.
У цьому випадку потрібно викинути ArgumentError.OverheatingError.
Цей клас помилки буде створено з аргументом температури.
Переконайтеся, що OverheatingError, яку ми викидаємо, має властивість температури.reportOverheating(null);
// Throws an ArgumentError
reportOverheating(800);
// Throws an OverheatingError
Тепер, коли наша машина вміє виявляти помилки, ми реалізуємо функцію, яка реагує на ці помилки різними способами:
Реалізуйте функцію monitorTheMachine, яка приймає аргумент actions.
actions - це обʼєкт, який має 4 властивості:
| властивість | опис |
|---|---|
check |
функція. Перевіряє температуру машини. Може викидати різні помилки. |
alertDeadSensor |
функція. Попереджає техніка, що датчик температури не працює. |
alertOverheating |
функція. Увімкне попереджувальний індикатор на машині. |
shutdown |
функція. Вимкне машину. |
Функція monitorTheMachine(actions) повинна всередині викликати check().
Якщо все гаразд, функція не повинна нічого повертати.
Якщо ж throw викине помилку, очікується інша поведінка:
| виняток | очікувана поведінка |
|---|---|
ArgumentError |
викликати функцію alertDeadSensor. |
OverheatingError |
виконати протокол перегріву. |
| (будь-що інше) | викинути помилку далі |
Протокол перегріву
Якщо температура менша за 600 °C, увімкніть попереджувальний індикатор, викликавши функцію alertOverheating.
Якщо температура перевищує 600 °C, ситуація критична, тож викличте функцію shutdown.
monitorTheMachine({
check,
alertDeadSensor,
alertOverheating,
shutdown,
});
Зареєструйтеся на Exercism, щоб вивчати й опановувати JavaScript, а також 37 концепцій159 вправ та справжнє наставництво від людей, і все це безкоштовно.