Undersøg undtagelser og processen til håndtering af undtagelser
- 11 minutter
Kørselsfejl i et C#-program administreres ved hjælp af en mekanisme, der kaldes undtagelser. Undtagelser giver en struktureret, ensartet og typesikker måde at håndtere fejltilstande på både systemniveau og programniveau på. Undtagelser genereres af .NET-kørselstidspunktet eller af koden i et program.
Almindelige scenarier, der kræver håndtering af undtagelser
Der er flere programmeringsscenarier, der kræver håndtering af undtagelser. Mange af disse scenarier omfatter en form for dataanskaffelse. Selvom nogle af scenarierne omfatter kodningsteknikker, der ikke er omfattet af denne oplæring, er de stadig værd at bemærke.
Almindelige scenarier, der kræver håndtering af undtagelser, omfatter:
Brugerinput: Der kan opstå undtagelser, når kode behandler brugerinput. Der opstår f.eks. undtagelser, når inputværdien er i det forkerte format eller uden for området.
Databehandling og beregninger: Der kan opstå undtagelser, når kode udfører databeregninger eller -konverteringer. Der opstår f.eks. undtagelser, når kode forsøger at dividere med nul, caste til en ikke-understøttet type eller tildele en værdi, der er uden for området.
Filinput-/outputhandlinger: Der kan opstå undtagelser, når kode læser fra eller skriver til en fil. Der opstår f.eks. undtagelser, når filen ikke findes, programmet ikke har tilladelse til at få adgang til filen, eller filen bruges af en anden proces.
Databasehandlinger: Der kan opstå undtagelser, når kode interagerer med en database. Der opstår f.eks. undtagelser, når databaseforbindelsen går tabt, der opstår en syntaksfejl i en SQL-sætning, eller der opstår en begrænsningsfejl.
Netværkskommunikation: Der kan opstå undtagelser, når kode kommunikerer via et netværk. Der opstår f.eks. undtagelser, når netværksforbindelsen går tabt, der opstår timeout, eller fjernserveren returnerer en fejl.
Andre eksterne ressourcer: Der kan opstå undtagelser, når kode kommunikerer med andre eksterne ressourcer. Webtjenester, REST API'er eller tredjepartsbiblioteker kan udløse undtagelser af forskellige årsager. Der opstår f.eks. undtagelser på grund af problemer med netværksforbindelser, forkert udformede data osv.
Undtagelseshåndtering af nøgleord, kodeblokke og mønstre
Håndtering af undtagelser i C# implementeres ved hjælp af nøgleordene try, catchog finally . Hvert af disse nøgleord har en tilknyttet kodeblok og kan bruges til at opfylde et bestemt mål i din tilgang til håndtering af undtagelser. For eksempel:
try
{
// try code block - code that may generate an exception
}
catch
{
// catch code block - code to handle an exception
}
finally
{
// finally code block - code to clean up resources
}
Seddel
C#-sproget gør det også muligt for din kode at generere et undtagelsesobjekt ved hjælp af nøgleordet throw . Undtagelseshåndteringsscenarier, der omfatter brug af nøgleordet throw til at generere undtagelser, dækkes i et separat modul på Microsoft Learn.
Kodeblokken try indeholder den bevogtede kode, der kan medføre en undtagelse. Hvis koden i en try blok forårsager en undtagelse, håndteres undtagelsen af en tilsvarende catch blok.
Kodeblokken catch indeholder den kode, der udføres, når der fanges en undtagelse. Blokken catch kan håndtere undtagelsen, logge den eller ignorere den. En catch blok kan konfigureres til at blive udført, når der opstår en undtagelsestype, eller kun når der forekommer en bestemt type undtagelse.
Kodeblokken finally indeholder kode, der udfører, om der opstår en undtagelse eller ej. Blokken finally bruges ofte til at rydde op i ressourcer, der er allokeret i en try blok. Det kan f.eks. være at sikre, at en variabel har den korrekte eller påkrævede værdi tildelt den.
Håndtering af undtagelser i et C#-program implementeres generelt ved hjælp af et eller flere af følgende mønstre:
- Mønsteret
try-catchbestår af entryblok efterfulgt af en eller flerecatchdelsætninger. Hvercatchblok bruges til at angive handlere for forskellige undtagelser. - Mønsteret
try-finallybestår af entryblok efterfulgt af enfinallyblok. Typisk køres sætningerne for enfinallyblok, når kontrolelementet forlader entrysætning. - Mønsteret
try-catch-finallyimplementerer alle tre typer undtagelseshåndteringsblokke. Et almindeligt scenarie for mønsterettry-catch-finallyer, når ressourcer hentes og bruges i entryblok, ekstraordinære omstændigheder administreres i encatchblok, og ressourcerne frigives eller på anden måde administreres ifinallyblokken.
Hvordan repræsenteres undtagelser i kode?
Undtagelser repræsenteres i kode som objekter, hvilket betyder, at de er en forekomst af en klasse. .NET-klassebiblioteket indeholder undtagelsesklasser, der tilgås i kode på samme måde som andre .NET-klasser. Et andet eksempel på .NET-klassen, der bruges som et objekt i kode, er klassen Random (bruges til at oprette tilfældige tal).
Mere præcist er undtagelser typer, der repræsenteres af klasser, der alle i sidste ende er afledt af System.Exception. En undtagelsesklasse, der er afledt af Exception , indeholder oplysninger, der identificerer undtagelsestypen og indeholder egenskaber, der indeholder oplysninger om undtagelsen. En mere detaljeret gennemgang af Exception klassen er inkluderet senere i dette modul.
En kørselsforekomst af en klasse kaldes generelt for et objekt, så undtagelser kaldes ofte undtagelsesobjekter.
Seddel
Selvom de nogle gange bruges i flæng, er en klasse og et objekt forskellige ting. En klasse definerer en objekttype, men det er ikke et objekt i sig selv. Et objekt er en konkret enhed, der er baseret på en klasse.
Proces til håndtering af undtagelser
Når der opstår en undtagelse, søger .NET-kørsel efter den nærmeste catch delsætning, der kan håndtere undtagelsen. Processen starter med den metode, der forårsagede, at undtagelsen blev udløst. Først undersøges metoden for at se, om den kode, der forårsagede undtagelsen, findes i en try kodeblok. Hvis koden er i try kodeblokken, tages de catch delsætninger, der er knyttet til sætningen try , i betragtning i rækkefølge. Hvis delsætningerne catch ikke kan håndtere undtagelsen, søges der efter den metode, der kaldte den aktuelle metode. Denne metode undersøges for at afgøre, om metodekaldet (til den første metode) er inde i en try kodeblok. Hvis opkaldet er inden for en try kodeblok, tages de tilknyttede catch delsætninger i betragtning. Denne søgeproces fortsætter, indtil der findes en catch delsætning, der kan håndtere den aktuelle undtagelse.
Når der er fundet en catch delsætning, der kan håndtere undtagelsen, forbereder kørslen sig på at overføre kontrolelementet til den første sætning i catch blokken. Men før udførelsen af catch blokken starter, udfører kørselstidspunktet alle finally blokke, der er knyttet try til sætninger, der blev fundet under søgningen. Hvis der findes mere end én finally blok, udføres de i rækkefølge, startende med den, der er tættest på den kode, der forårsagede, at undtagelsen blev udløst.
Hvis der ikke findes en catch delsætning til håndtering af undtagelsen, afslutter kørselsprogrammet og viser en fejlmeddelelse til brugeren.
Overvej følgende kodeeksempel, der indeholder et try-finally mønster indlejret i et try-catch mønster:
try
{
// Step 1: code execution begins
try
{
// Step 2: an exception occurs here
}
finally
{
// Step 4: the system executes the finally code block associated with the try statement where the exception occurred
}
}
catch // Step 3: the system finds a catch clause that can handle the exception
{
// Step 5: the system transfers control to the first line of the catch code block
}
I dette eksempel sker følgende proces:
- Udførelsen starter i kodeblokken i den ydre
trysætning. - Der udløses en undtagelse i kodeblokken i den indre
trysætning. - Runtime finder den delsætning,
catchder er knyttet til den ydretrysætning. - Før kontrolelementet til overførsel af kørsel til den første linje i
catchkodeblokken udføres denfinallydelsætning, der er knyttet til den indretrysætning. - Kørslen overfører derefter kontrolelementet til den første linje i
catchkodeblokken og udfører den kode, der håndterer undtagelsen.
I dette enkle eksempel er de indlejrede mønstre og mønstre placeret try-catch i en enkelt metode, men flere try-finally og try-catch mønstre kan fordeles mellem metoder, der kalder andre metoder.try-finally
Undtagelseshåndtering og opkaldsstak
Du får ofte vist udtrykket "afvikling af kaldstak", når du læser om håndtering af undtagelser og processen til håndtering af undtagelser. For at forstå dette ord skal du forstå kaldstakken, og hvordan den bruges til at spore "stakken" for metodekald under udførelse af kode.
Du kan tænke på opkaldstakken som et tårn af blokke. Når du bygger et tårn, starter du med kun én blok. Hver gang du føjer en blok til tårnet, placerer du den oven på de eksisterende blokke. Når programmet begynder at køre i fejlfindingsprogrammet, er indgangspunktet til dit program det første lag, der føjes til opkaldsstakken (den første blok i tårnet). Hver gang en metode kalder en anden metode, føjes den nye metode til toppen af stakken. Når din kode afsluttes af en metode, fjernes metoden fra kaldstakken.
Seddel
For et konsolprogram er indgangspunktet til dit program sætningerne på øverste niveau. I Visual Studio Code-kaldstakken kaldes Main dette indgangspunkt metoden .
Fjernelse af kaldstak er den proces, som .NET-kørsel bruger, når der opstår en fejl i et C#-program. Det er den samme proces, som du lige har gennemgået.
Når du vender tilbage til bloktårnets analogi, når du har brug for at fjerne en blok fra tårnet, starter du fra toppen og fjerner hver blok, indtil du når den, du har brug for. Denne proces svarer til den måde, som fjernelse af opkaldsstak fungerer på, hvor hvert opkaldslag i stakken er som en blok i tårnet. Når kørslen skal slappe af i opkaldsstakken, starter den fra toppen og fjerner hvert opkaldslag, indtil det når det, der har det, det har brug for. I dette tilfælde er det kaldlag, der skal bruges, den metode, der har en catch delsætning, der kan håndtere den undtagelse, der opstod.
Resumé
Her er et par vigtige ting, du skal huske fra dette undermodul:
- Almindelige scenarier, der kan kræve håndtering af undtagelser, omfatter brugerinput, databehandling, fil-I/O-handlinger, databasehandlinger og netværkskommunikation.
- Håndtering af undtagelser i C# implementeres ved hjælp af
trynøgleordene ,catchogfinally. Hvert nøgleord har en tilknyttet kodeblok, der tjener et bestemt formål. - Undtagelser repræsenteres som typer og er afledt af
System.Exceptionklassen i .NET. Undtagelser indeholder oplysninger, der identificerer undtagelsestypen og egenskaber, der giver yderligere oplysninger. - Når der opstår en undtagelse, søger .NET-kørsel efter den nærmeste
catchdelsætning, der kan håndtere den. Søgningen starter med den metode, hvor undtagelsen blev udløst, og flytter om nødvendigt kaldstakken ned.