Error
Wbudowany obiekt błędu z komunikatem i śladem stosu. Podstawa wyjątków i własnych klas błędów.
- Zwraca
- Nowy obiekt
Error.
Przykład
#const error = new Error('Nie znaleziono lekcji')
console.log(error.name)
console.log(error.message)
console.log(error instanceof Error)
console.log(error)Definicja i zastosowanie
#Error to wbudowana klasa opisująca błąd. Tworzysz ją przez new Error("komunikat") i najczęściej od razu rzucasz instrukcją throw. Każdy błąd ma pole name z rodzajem błędu, message z opisem oraz stack, czyli ślad wywołań prowadzących do miejsca, w którym powstał. Ślad stosu pomaga znaleźć źródło problemu.
JavaScript ma kilka wbudowanych odmian błędów: TypeError (zły typ, np. wywołanie czegoś, co nie jest funkcją), RangeError (wartość spoza dozwolonego zakresu), SyntaxError (błędna składnia, np. w tekście dla JSON.parse()), ReferenceError (odwołanie do nieistniejącej zmiennej) i URIError. Wszystkie dziedziczą po Error, więc instanceof Error zwraca dla nich true. AggregateError zbiera kilka błędów naraz, np. z Promise.any().
Własne klasy błędów tworzysz przez extends Error. Warto ustawić w nich name i dodać pola z dodatkowymi informacjami, np. nazwę pola formularza. Opcja cause w drugim argumencie, new Error("komunikat", { cause }), dołącza przyczynę: pierwotny błąd albo dane, które pomogą zrozumieć, co poszło nie tak.
Składnia
#new Error()
new Error(message)
new Error(message, { cause })
error.name
error.message
error.cause
error.stackParametry
#message
napis, opcjonalny
Opis błędu. Trafia do polaerror.message.options
obiekt, opcjonalny
Obiekt z polemcause, czyli przyczyną błędu, najczęściej innym błędem.
Więcej przykładów
#class AppError extends Error {
constructor(message, options) {
super(message, options)
this.name = this.constructor.name
}
}
class NotEnoughFuelError extends AppError {
constructor(needed, available) {
super(`Potrzeba ${needed} paliwa, masz ${available}`)
this.needed = needed
}
}
try {
throw new NotEnoughFuelError(3, 1)
} catch (error) {
console.log(error)
console.log(error instanceof AppError, error instanceof Error)
console.log(error.needed)
}Klasa bazowa ustawia name na nazwę faktycznej klasy, więc każdy kolejny rodzaj błędu dostaje poprawną nazwę bez powtarzania kodu. Jeśli narzędzie budujące skraca nazwy klas, wpisz name ręcznie.
function saveScore(response) {
if (!response.ok) {
throw new Error('Nie zapisano wyniku', { cause: { status: response.status } })
}
return 'Zapisano'
}
try {
saveScore({ ok: false, status: 503 })
} catch (error) {
console.log(error.message)
console.log(error.cause)
}const attempts = [
() => null.length,
() => new Array(-1),
() => JSON.parse('{zepsute'),
() => missingVariable
]
for (const attempt of attempts) {
try {
attempt()
} catch (error) {
console.log(error.name, error instanceof Error)
}
}Obsługa przeglądarek
#Szeroko dostępne
Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.
- Chrome
- Edge
- Firefox
- Safari
Dobre praktyki
#- Pisz komunikaty, które mówią, co się stało i co zrobić dalej. „Brak paliwa. Wróć jutro” pomoże bardziej niż „Błąd 17”.
- Ustawiaj
namewe własnych klasach błędów. Bez tego konsola i logi pokażą ogólne „Error”, a wcatchtrudniej rozpoznać rodzaj problemu. - Pole
stackprzydaje się przy debugowaniu, ale jego format różni się między przeglądarkami. Nie analizuj go w logice programu i nie pokazuj go użytkownikom.
Powiązane hasła
#- throwRzuca wyjątek: przerywa bieżący kod i przekazuje błąd do najbliższego bloku catch.
- try...catchPrzechwytuje błędy rzucone w bloku try i obsługuje je w catch. Opcjonalny finally wykona się zawsze.
- extendsTworzy klasę pochodną, która dziedziczy metody innej klasy i może je rozszerzać lub nadpisywać.
- instanceofSprawdza, czy obiekt został utworzony przez daną klasę albo przez klasę, która po niej dziedziczy.
- Promise.prototype.catch()Rejestruje funkcję obsługi błędu, wywoływaną, gdy obietnica zostanie odrzucona.
Widzisz błąd albo brakuje przykładu? Napisz do nas.