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")); // 8080Wywoł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
- Problem z rzucaniem błędów
- Modelowanie typów Result
- Typy Option i Maybe
- Programowanie zorientowane na tory