throw
Rzuca wyjątek: przerywa bieżący kod i przekazuje błąd do najbliższego bloku catch.
Przykład
#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)
}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
#throw expression
throw new Error(message)
throw new Error(message, { cause })Więcej przykładów
#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)
}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)
}try {
throw 'Coś poszło nie tak'
} catch (error) {
console.log(typeof error, error.message)
}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
asyncinstrukcjathrowodrzuca zwracaną obietnicę. Obsłużysz to przeztry...catchzawaitalbo 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
#- try...catchPrzechwytuje błędy rzucone w bloku try i obsługuje je w catch. Opcjonalny finally wykona się zawsze.
- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
- Promise.prototype.catch()Rejestruje funkcję obsługi błędu, wywoływaną, gdy obietnica zostanie odrzucona.
- async functionDeklaruje funkcję asynchroniczną, która zawsze zwraca obietnicę i może używać w środku słowa await.
- ErrorWbudowany obiekt błędu z komunikatem i śladem stosu. Podstawa wyjątków i własnych klas błędów.
Widzisz błąd albo brakuje przykładu? Napisz do nas.