throw

Rzuca wyjątek: przerywa bieżący kod i przekazuje błąd do najbliższego bloku catch.

Na tej stronie

Przykład

#
JavaScript
function useFuel(fuel, amount) {
  if (amount > fuel) {
    throw new RangeError('Za mało paliwa')
  }
  return fuel - amount
}

try {
  console.log(useFuel(10, 3))
  console.log(useFuel(10, 20))
} catch (error) {
  console.log(error.name, error.message)
}
Konsola
7
RangeError Za mało paliwa

Definicja i zastosowanie

#

Instrukcja throw zgłasza błąd. Wykonanie funkcji natychmiast się przerywa, a błąd wędruje w górę przez kolejne wywołania, aż trafi na blok catch. Jeśli nikt go nie złapie, pojawi się w konsoli jako nieobsłużony błąd.

Rzucić można dowolną wartość, ale zawsze używaj obiektów Error lub jego odmian, np. TypeError i RangeError. Mają one pola name i message oraz ślad stosu (stack), który pokazuje, gdzie powstał problem.

Dla błędów z Twojej domeny możesz stworzyć własną klasę dziedziczącą po Error. Opcja cause pozwala dołączyć pierwotny błąd, gdy opakowujesz go w bardziej zrozumiały komunikat: new Error("Nie zapisano postępu", { cause: error }).

Składnia

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

Więcej przykładów

#
Własna klasa błędu
JavaScript
class ValidationError extends Error {
  constructor(field, message) {
    super(message)
    this.name = 'ValidationError'
    this.field = field
  }
}

function validateEmail(email) {
  if (!email.includes('@')) {
    throw new ValidationError('email', 'Brak znaku @')
  }
  return true
}

try {
  validateEmail('ania.example.com')
} catch (error) {
  console.log(error instanceof ValidationError, error.field)
  console.log(error)
}
Konsola
true email
ValidationError: Brak znaku @
Opakowanie błędu przez cause
JavaScript
function saveProgress(data) {
  try {
    JSON.parse(data)
  } catch (error) {
    throw new Error('Nie zapisano postępu', { cause: error })
  }
}

try {
  saveProgress('{zepsute')
} catch (error) {
  console.log(error.message)
  console.log(error.cause.name)
}
Konsola
Nie zapisano postępu
SyntaxError
Pułapka: rzucanie napisu
JavaScript
try {
  throw 'Coś poszło nie tak'
} catch (error) {
  console.log(typeof error, error.message)
}
Konsola
string undefined

Rzucony napis nie ma pola message ani śladu stosu. Dlatego zawsze rzucaj obiekty 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

#
  • Rzucaj błąd od razu, gdy wykryjesz złe dane, i pisz komunikat, który mówi, co poprawić. „Punkty muszą być liczbą” pomoże bardziej niż „Błąd”.
  • W funkcji async instrukcja throw odrzuca zwracaną obietnicę. Obsłużysz to przez try...catch z await albo przez .catch().
  • Nie używaj wyjątków do zwykłego sterowania programem, np. do wychodzenia z pętli. Są przeznaczone na sytuacje wyjątkowe.

Powiązane hasła

#

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