0Pricing
TypeScript Academy · Lekcja

Problem z rzucaniem błędów

Dowiedz się, dlaczego wyjątki ukrywają niepowodzenia przed systemem typów

Problem z rzucaniem błędów to bezpłatna lekcja TypeScript Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej TypeScript Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs TypeScript Academy zawiera 4 lekcji w sumie.

Wyjątki są niewidoczne

Gdy funkcja wykonuje throw, jej sygnatura tego nie informuje. System typów nie widzi, które funkcje mogą zakończyć się błędem, więc kompilator nie przypomina wywołującemu o konieczności obsługi błędów.

Funkcja zgłaszająca wyjątek

Ta funkcja wygląda tak, jakby zawsze zwracała liczbę, ale może zgłosić wyjątek. Typ zwracany number całkowicie ukrywa przypadek błędu.

function parsePort(s: string): number {
  const n = Number(s);
  if (Number.isNaN(n)) throw new Error("bad port");
  return n;
}
console.log(parsePort("8080")); // 8080

Wywołujący zapominają przechwycić wyjątek

Nic nie zmusza wywołującego do opakowania wywołania w try/catch. Taki błąd nie przeszkadza w kompilacji i ujawnia się dopiero jako awaria w czasie wykonywania.

const port = parsePort("oops");
// No compile error; throws at runtime, possibly crashing the app.

try/catch gubi typ

Nawet gdy wyjątek zostanie przechwycony, przechwycona wartość ma typ unknown (albo any). Kształt błędu nie jest śledzony, więc jego obsługa opiera się na zgadywaniu.

try {
  parsePort("x");
} catch (e) {
  // e: unknown -> you must narrow it manually
}

Błędy jako wartości

Alternatywą jest potraktowanie błędu jako zwykłej wartości zwracanej przez funkcję, a nie wyjątku przez nią zgłaszanego. Wtedy typ zwracany uczciwie pokazuje oba możliwe wyniki.

Szkic funkcji zwracającej wartość

Zamiast zgłaszać wyjątek należy zwrócić obiekt z oznaczeniem, który opisuje powodzenie albo błąd. Wywołujący musi go sprawdzić przed użyciem wartości.

type ParseResult =
  | { ok: true; value: number }
  | { ok: false; error: string };

Typ mówi teraz prawdę

Funkcja zwracająca ParseResult informuje, że może zakończyć się błędem. Kompilator wymaga wtedy od wywołującego obsłużenia gałęzi błędu.

function parsePort(s: string): ParseResult {
  const n = Number(s);
  return Number.isNaN(n)
    ? { ok: false, error: "bad port" }
    : { ok: true, value: n };
}

Wymuszona obsługa

Ponieważ wartość może należeć do dowolnej z obu gałęzi, nie można odczytać value bez wcześniejszego sprawdzenia ok. Kompilator zawęża typ dopiero po tym sprawdzeniu.

const r = parsePort("oops");
if (r.ok) console.log(r.value);
else console.log("failed:", r.error);

Wyjątki nadal mają swoje miejsce

Naprawdę nieoczekiwane, niemożliwe do odzyskania błędy (błędy programisty, brak pamięci) nadal mogą zgłaszać wyjątki. Błędy jako wartości sprawdzają się w przypadku oczekiwanych błędów, takich jak błędy parsowania i walidacji.

Jawność zamiast niejawności

Zwracanie błędów sprawia, że ścieżka błędu jest jawna w typie, widoczna w miejscu wywołania i nie można jej przypadkowo zignorować, w przeciwieństwie do ukrytego throw.

W stronę Result i Option

Ten kształt oznaczający powodzenie albo błąd można uogólnić do wielokrotnego użytku jako typ Result, a brak lub obecność wartości — jako typ Option. Oba typy zostaną omówione dalej.

Szybki test

Szybki test z tego tematu.

Podsumowanie

Zgłaszane wyjątki są dla typów niewidoczne: sygnatury ukrywają możliwość błędu, a wywołujący zapominają o jego przechwyceniu. Zwracanie błędu jako jawnej wartości (obiektu z oznaczeniem powodzenia lub błędu) uwidacznia ścieżkę błędu w typie i uniemożliwia jej zignorowanie, prowadząc do typów Result i Option.

Często zadawane pytania

Czy lekcja „Problem z rzucaniem błędów” jest bezpłatna?

Tak — pełny tekst „Problem z rzucaniem błędów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu TypeScript Academy, przejdź na CoddyKit PRO. Kurs TypeScript Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Problem z rzucaniem błędów”?

Dowiedz się, dlaczego wyjątki ukrywają niepowodzenia przed systemem typów Ćwiczysz TypeScript Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć TypeScript Academy?

Nie wymagamy żadnego doświadczenia. TypeScript Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Problem z rzucaniem błędów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji TypeScript Academy?

Tak. Każda lekcja TypeScript Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Problem z rzucaniem błędów
  2. Modelowanie typów Result
  3. Typy Option i Maybe
  4. Programowanie zorientowane na tory
← Powrót do TypeScript Academy