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

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
- Napisz funkcję, która oblicza pierwiastek kwadratowy z liczby. Funkcja powinna rzucać wyjątek, jeśli argument jest liczbą ujemną.
- 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
Docker vs Kubernetes: Który dla Ciebie w 2025?
Docker i Kubernetes objaśnione! Która technologia lepsza dla początkujących w 2025? Porównanie, przykłady i przyszłość.
Mateusz Kędziora
DevOps: Automatyzacja zadań sysadmina dla programistów
Zautomatyzuj pracę sysadmina w środowisku DevOps! Praktyczne przykłady, skrypty, Ansible, Terraform, Prometheus i Grafana.
Mateusz Kędziora
Automatyzacja Linux/macOS z Bash: Praktyczny Przewodnik
Zacznij automatyzować system Linux/macOS z Bash! Dowiedz się, czym jest Bash, jak pisać skrypty i używać podstawowych komend.
Mateusz Kędziora