Problemet med at kaste fejl
Forstå, hvorfor exceptions skjuler fejl for typesystemet
Problemet med at kaste fejl er en gratis TypeScript Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i TypeScript Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. TypeScript Academy-kurset indeholder 4 lektioner i alt.
Undtagelser er usynlige
Når en funktion udfører throw, fremgår det ikke af dens signatur. Typesystemet kan ikke se, hvilke funktioner der kan fejle, så den kaldende kode får ingen påmindelse fra compileren om at håndtere fejl.
En funktion, der kaster undtagelser
Denne funktion ser ud til altid at returnere et tal, men den kan kaste en undtagelse. Returtypen number skjuler fuldstændigt tilfældet med fejl.
function parsePort(s: string): number {
const n = Number(s);
if (Number.isNaN(n)) throw new Error("bad port");
return n;
}
console.log(parsePort("8080")); // 8080Den kaldende kode glemmer at fange fejlen
Der er intet, der tvinger den kaldende kode til at indpakke kaldet i try/catch. Fejlen kompilerer uden problemer og viser sig først som et nedbrud under kørsel.
const port = parsePort("oops");
// No compile error; throws at runtime, possibly crashing the app.try/catch mister typen
Selv når du fanger fejlen, får den fangede værdi typen unknown (eller any). Fejlens struktur spores ikke, så håndteringen bliver et gæt.
try {
parsePort("x");
} catch (e) {
// e: unknown -> you must narrow it manually
}Fejl som værdier
Alternativet er at gøre fejl til en almindelig værdi, som funktionen returnerer, i stedet for en undtagelse, den kaster. Så viser returtypen ærligt begge udfald.
En skitse med returværdi
I stedet for at kaste en undtagelse returnerer du et mærket objekt, der beskriver succes eller fejl. Den kaldende kode skal undersøge objektet, før den bruger værdien.
type ParseResult =
| { ok: true; value: number }
| { ok: false; error: string };Typen fortæller nu sandheden
En funktion, der returnerer ParseResult, angiver tydeligt, at den kan fejle. Compileren kræver derefter, at den kaldende kode håndterer fejlgrenen.
function parsePort(s: string): ParseResult {
const n = Number(s);
return Number.isNaN(n)
? { ok: false, error: "bad port" }
: { ok: true, value: n };
}Tvungen håndtering
Fordi værdien kan tilhøre begge grene, kan du ikke læse value uden først at kontrollere ok. Compileren indsnævrer først typen efter kontrollen.
const r = parsePort("oops");
if (r.ok) console.log(r.value);
else console.log("failed:", r.error);Undtagelser har stadig deres plads
Virkelig uventede fejl, der ikke kan genoprettes fra (programmeringsfejl, mangel på hukommelse), kan stadig kaste undtagelser. Fejl som værdier er bedst til forventede fejl som analyse af input og validering.
Eksplicit frem for implicit
Returnering af fejl gør fejlforløbet eksplicit i typen, synligt ved kaldestedet og umuligt at ignorere ved et uheld, i modsætning til et skjult throw.
På vej mod Result og Option
Denne mærkede struktur for succes eller fejl generaliseres til en genanvendelig Result-type, og fravær kontra tilstedeværelse generaliseres til Option. Begge dele gennemgås i det næste afsnit.
Hurtigt tjek
Et hurtigt tjek af denne lektion.
Opsamling
Fejl, der kastes, er usynlige for typerne: Signaturer skjuler fejl, og den kaldende kode glemmer at fange dem. Når fejl returneres som en eksplicit værdi (et mærket objekt for succes eller fejl), bliver fejlforløbet synligt i typen og umuligt at ignorere. Det fører videre til Result- og Option-typer.
Lær TypeScript med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 101
- Lektioner
- 352
Ofte stillede spørgsmål
Er lektionen “Problemet med at kaste fejl” gratis?
Ja — hele teksten til “Problemet med at kaste fejl” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af TypeScript Academy-kurset, skal du opgradere til CoddyKit PRO. TypeScript Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Problemet med at kaste fejl”?
Forstå, hvorfor exceptions skjuler fejl for typesystemet Du øver dig i TypeScript Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på TypeScript Academy?
Der kræves ingen tidligere erfaring. TypeScript Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Problemet med at kaste fejl”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne TypeScript Academy-lektion?
Ja. Alle TypeScript Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Problemet med at kaste fejl
- Modellering af Result-typer
- Option- og Maybe-typer
- Railway-oriented programming