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.
Na tej stronie

Przykład

#
JavaScript
const error = new Error('Nie znaleziono lekcji')

console.log(error.name)
console.log(error.message)
console.log(error instanceof Error)
console.log(error)
Konsola
Error
Nie znaleziono lekcji
true
Error: Nie znaleziono lekcji

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

#
Składnia
new Error()
new Error(message)
new Error(message, { cause })

error.name
error.message
error.cause
error.stack

Parametry

#
  • message

    napis, opcjonalny

    Opis błędu. Trafia do pola error.message.
  • options

    obiekt, opcjonalny

    Obiekt z polem cause, czyli przyczyną błędu, najczęściej innym błędem.

Więcej przykładów

#
Hierarchia własnych błędów
JavaScript
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)
}
Konsola
NotEnoughFuelError: Potrzeba 3 paliwa, masz 1
true true
3

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.

Przyczyna błędu w cause
JavaScript
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)
}
Konsola
Nie zapisano wyniku
{ status: 503 }
Wbudowane rodzaje błędów
JavaScript
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)
  }
}
Konsola
TypeError true
RangeError true
SyntaxError true
ReferenceError true

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 name we własnych klasach błędów. Bez tego konsola i logi pokażą ogólne „Error”, a w catch trudniej rozpoznać rodzaj problemu.
  • Pole stack przydaje 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

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.