Node.js dla początkujących - Część 8: Obsługa błędów

1/13/2025 Kurs JavaScript

Mateusz Kędziora

image

Pisanie kodu to nieustanna podróż, pełna niespodzianek – czasem miłych, a czasem… no cóż, mniej. Każdy programista, niezależnie od stażu, spotyka się z błędami. Kluczem nie jest ich unikanie (bo to niemożliwe), ale umiejętne radzenie sobie z nimi. W tym artykule pokażemy Ci, jak w JavaScript okiełznać błędy i pisać kod bez stresu, korzystając z mechanizmów try...catch, finally oraz throw. Zaczynamy!

Dlaczego błędy są ważne?

Wyobraź sobie, że piszesz program do obliczania pola prostokąta. Co się stanie, gdy użytkownik zamiast liczb poda litery? Twój program „wybuchnie” i wyświetli nieprzyjemny komunikat błędu. Chcemy tego uniknąć! Obsługa błędów pozwala nam przewidywać takie sytuacje i reagować na nie w kontrolowany sposób, np. wyświetlając przyjazny komunikat dla użytkownika.

try...catch: Łapiemy błędy w locie

Konstrukcja try...catch pozwala nam „spróbować” wykonać dany blok kodu (try), a jeśli w trakcie jego wykonywania wystąpi błąd, „złapać” go (catch) i odpowiednio zareagować.

try {
  // Kod, który może wygenerować błąd
  let wynik = 10 / 0; // Dzielenie przez zero!
  console.log("Wynik: " + wynik); // Ten kod się nie wykona, jeśli wystąpi błąd
} catch (error) {
  // Kod, który zostanie wykonany w przypadku błędu
  console.error("Wystąpił błąd: " + error.message); // Wyświetli komunikat o błędzie
}

W powyższym przykładzie próbujemy podzielić 10 przez 0, co w matematyce jest operacją niedozwoloną. JavaScript zgłosi błąd. Dzięki try...catch możemy go „złapać” i wyświetlić zrozumiały komunikat zamiast „wykrzaczyć” program. Zmienna error w bloku catch zawiera informacje o błędzie, np. jego typ i opis (error.message).

finally: Co ma się wydarzyć na końcu?

Blok finally jest opcjonalny i umieszcza się go po bloku catch. Kod wewnątrz finally zawsze zostanie wykonany, niezależnie od tego, czy błąd wystąpił, czy nie. Jest to przydatne do wykonywania operacji „czyszczących”, np. zamykanie połączenia z bazą danych czy zwalnianie zasobów.

try {
  // Kod, który może wygenerować błąd
  console.log("Próbujemy coś zrobić...");
  // throw new Error("Ups, coś poszło nie tak!"); // Rzucamy własny błąd (o tym za chwilę)
} catch (error) {
  console.error("Złapaliśmy błąd: " + error.message);
} finally {
  console.log("Koniec operacji, sprzątamy!"); // To zawsze się wykona
}

throw: Rzucamy własne wyjątki

Czasami chcemy sami zgłosić błąd, np. gdy funkcja otrzyma nieprawidłowe argumenty. Do tego służy instrukcja throw.

function dzielenie(a, b) {
  if (b === 0) {
    throw new Error("Dzielenie przez zero jest niedozwolone!");
  }
  return a / b;
}

try {
  let wynik = dzielenie(10, 0);
  console.log("Wynik: " + wynik);
} catch (error) {
  console.error("Wystąpił błąd: " + error.message);
}

W tym przykładzie funkcja dzielenie sprawdza, czy drugi argument (b) jest równy zero. Jeśli tak, rzuca wyjątek typu Error z odpowiednim komunikatem.

Różne typy błędów

JavaScript oferuje kilka wbudowanych typów błędów, m.in.:

  • Error: Ogólny błąd.
  • TypeError: Błąd typu (np. próba wywołania metody na zmiennej, która nie jest obiektem).
  • ReferenceError: Błąd odwołania (np. próba użycia niezadeklarowanej zmiennej).
  • SyntaxError: Błąd składni (np. brak nawiasu).

Znajomość typów błędów pozwala na bardziej precyzyjną ich obsługę, np. w bloku catch możemy sprawdzić typ błędu i zareagować na niego w specyficzny sposób.

try {
  // Kod, który może wygenerować różne typy błędów
  let obj = null;
  obj.metoda(); // TypeError!
} catch (error) {
  if (error instanceof TypeError) {
    console.error("Błąd typu: " + error.message);
  } else {
    console.error("Inny błąd: " + error.message);
  }
}

Praca domowa

  1. Napisz funkcję, która oblicza pierwiastek kwadratowy z liczby. Funkcja powinna rzucać wyjątek, jeśli argument jest liczbą ujemną.
  2. Zmodyfikuj powyższą funkcję, aby obsługiwała różne typy błędów (np. TypeError, jeśli argument nie jest liczbą).

Eksperymentuj!

Najlepszym sposobem na naukę jest praktyka. Zachęcamy Cię do samodzielnego eksperymentowania z kodem, modyfikowania go i obserwowania, co się stanie. Pamiętaj, że błędy są naturalną częścią procesu programowania. Dzięki try...catch, finally i throw możesz je okiełznać i pisać solidny kod.

Jeśli spodobał Ci się ten artykuł, koniecznie przeczytaj pozostałe posty z kursu JavaScript dla początkujących! Znajdziesz tam mnóstwo przydatnych informacji i praktycznych przykładów. Powodzenia!

Polecane artykuły