Øvelse – opret og kast en undtagelse
Udviklere skal ofte oprette og smide undtagelser fra en metode og derefter fange disse undtagelser længere nede i opkaldsstakken, hvor de kan håndteres. Håndtering af undtagelser hjælper dig med at sikre stabiliteten af dine programmer.
I denne øvelse skal du starte med et eksempelprogram, der indeholder en potentiel fejlbetingelse i en kaldet metode. Din opdaterede metode vil throw være en undtagelse, når problemet registreres. Undtagelsen håndteres i en catch blok af den kode, der kalder metoden. Resultatet er et program, der giver en bedre brugeroplevelse.
Opret et nyt kodeprojekt
Det første trin er at oprette et kodeprojekt, som du kan bruge under dette modul.
Åbn en ny forekomst af Visual Studio Code.
Vælg Åbn mappe i menuen Filer.
Gå til mappen Windows Desktop i dialogboksen Åbn mappe.
Vælg Ny mappe i dialogboksen Åbn mappe.
Navngiv den nye mappe ThrowExceptions101, og vælg derefter Vælg mappe.
I menuen Terminal skal du vælge Ny terminal.
Du skal bruge en .NET CLI-kommando til at oprette en ny konsolapp.
Angiv følgende kommando ved kommandoprompten i TERMINAL-panelet:
dotnet new consoleLuk terminalpanelet.
Gennemse et eksempelprogram
Brug følgende trin til at indlæse og gennemse et eksempelprogram.
Åbn filen Program.cs.
Vælg Kommandopalet i menuen Vis.
I kommandoprompten skal du angive .net: g og derefter vælge .NET: Generér aktiver til build og fejlfinding.
Erstat indholdet af filen Program.cs med følgende kode:
// Prompt the user for the lower and upper bounds Console.Write("Enter the lower bound: "); int lowerBound = int.Parse(Console.ReadLine()); Console.Write("Enter the upper bound: "); int upperBound = int.Parse(Console.ReadLine()); decimal averageValue = 0; // Calculate the sum of the even numbers between the bounds averageValue = AverageOfEvenNumbers(lowerBound, upperBound); // Display the value returned by AverageOfEvenNumbers in the console Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}."); // Wait for user input Console.ReadLine(); static decimal AverageOfEvenNumbers(int lowerBound, int upperBound) { int sum = 0; int count = 0; decimal average = 0; for (int i = lowerBound; i <= upperBound; i++) { if (i % 2 == 0) { sum += i; count++; } } average = (decimal)sum / count; return average; }Brug et øjeblik på at gennemse koden.
Bemærk, at programmet udfører følgende opgaver:
Sætningerne på øverste niveau bruger
Console.ReadLine()sætninger til at hente værdier forlowerBoundogupperBound.Sætningerne på øverste niveau overføres
lowerBoundogupperBoundsom argumenter, når metodenAverageOfEvenNumberskaldes.Metoden
AverageOfEvenNumbersudfører følgende opgaver:- Deklarerer lokale variabler, der bruges i beregninger.
- Bruger en
forløkke til at opsummere lige tal mellemlowerBoundogupperBound. Summen gemmes isum. - Tæller, hvor mange tal der er inkluderet i summen. Antallet gemmes i
count. - Gemmer gennemsnittet af de sammenlagte tal i en variabel med navnet
average. Værdien afaveragereturneres.
Sætningerne på øverste niveau udskriver den værdi, der returneres af
AverageOfEvenNumberstil konsollen, og afbryder derefter udførelsen midlertidigt.
Konfigurer fejlfindingsmiljøet
Eksempelprogrammet læser brugerinput fra konsollen. Panelet DEBUG CONSOLE understøtter ikke læseinput fra konsollen. Du skal opdatere launch.json-filen, før du kan køre programmet i fejlfindingsprogrammet.
Brug stifindervisningen til at åbne launch.json-filen.
Opdater attributten
consolepå følgende måde i filen launch.json:// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",Standardværdien for attributten
consoleerinternalConsole, som er i overensstemmelse med panelet DEBUG CONSOLE. Desværre understøtter DEBUG CONSOLE-panelet ikke konsolinput. IndstillingenintegratedTerminaljusteres i forhold til TERMINAL-panelet, som understøtter konsolinput og -output.Gem ændringerne i launch.json-filen, og luk derefter filen.
Vælg Start fejlfinding i menuen Kørsel af Visual Studio Code.
Skift til terminalpanelet.
Ved prompten "nedre grænse" skal du skrive 3
Ved prompten "øvre grænse" skal du skrive 11
Bemærk, at programmet viser følgende meddelelse og derefter stopper midlertidigt:
The average of even numbers between 3 and 11 is 7.Tryk på Enter for at afslutte programmet.
Kast en undtagelse i metoden AverageOfEvenNumbers
Metoden AverageOfEvenNumbers forventer en øvre grænse, der er større end den nedre grænse. Der DivideByZero opstår en fejl, hvis den nedre grænse er større end eller lig med den øvre grænse.
Du skal opdatere AverageOfEvenNumbers metoden for at udløse en undtagelse, når den nedre grænse er større end eller lig med den øvre grænse.
Brug et øjeblik på at overveje, hvordan du vil løse problemet.
En mulighed er at ombryde beregningen af
averagei entrykodeblok ogcatchundtagelsenDivideByZero, når den opstår. Du kan omstyrte undtagelsen og derefter håndtere den i opkaldskoden.En anden mulighed er at evaluere inputparametrene, før du starter beregningerne. Hvis
lowerBounder større end eller lig medupperBound, kan du udløse en undtagelse.Evaluering af parametrene og aktivering af en undtagelse, før beregningerne startes, er det bedste valg.
Overvej, hvilken undtagelsestype der skal udløses.
Der er to undtagelsestyper, der er i overensstemmelse med problemet:
-
ArgumentOutOfRangeException– EnArgumentOutOfRangeExceptionundtagelsestype skal kun udløses, når værdien af et argument er uden for det tilladte interval af værdier, som defineret af den aktiverede metode. SelvomAverageOfEvenNumbersikke eksplicit definerer et tilladt interval forlowerBoundellerupperBound, betyder værdien aflowerBounddet tilladte interval forupperBound. -
InvalidOperationException: EnInvalidOperationExceptionundtagelsestype skal kun udløses, når driftsbetingelserne for en metode ikke understøtter en vellykket fuldførelse af et bestemt metodekald. I dette tilfælde er driftsbetingelserne fastlagt af inputparametrene for metoden.
Når du har to eller flere undtagelsestyper at vælge imellem, skal du vælge den undtagelsestype, der passer bedre til problemet. I dette tilfælde er de to undtagelsestyper justeret ligeligt i forhold til problemet.
Når du har to eller flere undtagelsestyper, der er justeret ligeligt efter problemet, skal du vælge den mest begrænsede undtagelsestype. Undtagelsestypen
ArgumentOutOfRangeExceptioner begrænset til de argumenter, der overføres til metoden.InvalidOperationExceptionUndtagelsestypen er begrænset til driftsbetingelserne for metoden. I dette tilfælde er undtagelsestypenArgumentOutOfRangeExceptionmere begrænset endInvalidOperationExceptionundtagelsestypen.Metoden
AverageOfEvenNumbersskal udløse enArgumentOutOfRangeExceptionundtagelse.-
Øverst i
AverageOfEvenNumbersmetoden skal du opdatere din kode på følgende måde for at registrere problemet med den øvre grænse:if (lowerBound >= upperBound) { } int sum = 0;Hvis du vil oprette og udløse en
ArgumentOutOfRangeExceptionundtagelse, skal du opdatereifkodeblokken på følgende måde:if (lowerBound >= upperBound) { throw new ArgumentOutOfRangeException("upperBound", "ArgumentOutOfRangeException: upper bound must be greater than lower bound."); }Denne kodelinje initialiserer en ny forekomst af
ArgumentOutOfRangeExceptionklassen med navnet på den inputparameter, der forårsager undtagelsen, og en angivet fejlmeddelelse.
Fange undtagelsen i opkaldskoden
Når det er muligt, skal undtagelser fanges på opkaldsstakniveauet, hvor de kan håndteres. I dette eksempelprogram kan parametrene for AverageOfEvenNumbers metoden administreres i kaldemetoden (sætningerne på øverste niveau).
Rul op til sætningerne på øverste niveau.
Hvis du vil omslutte metodekaldet og
AverageOfEvenNumbers-sætningenConsole.WriteLinei entrykodeblok, skal du opdatere din kode på følgende måde:try { // Calculate the sum of the even numbers between the bounds averageValue = AverageOfEvenNumbers(lowerBound, upperBound); // Display the result to the user Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}."); }Hvis du vil oprette den tilknyttede
catchdelsætning, skal du angive følgende kode:catch(ArgumentOutOfRangeException ex) { }Brug et øjeblik på at overveje, hvordan du kan håndtere undtagelsen.
Hvis du vil håndtere denne undtagelse, skal koden gøre følgende:
- Forklar problemet for brugeren.
- Hent en ny værdi for
upperBound. - Ring op
AverageOfEvenNumbersved hjælp af den nyeupperBound. - Fortsæt til
catchundtagelsen, hvis den nyeupperBoundangivne er stadig mindre end eller lig medlowerBound.
Hvis du fortsætter med
catchundtagelsen, kræver det en løkke. Da du vil kaldeAverageOfEvenNumbersmetoden mindst én gang, skal der bruges endoløkke.Hvis du vil omslutte blokkene
tryogcatchi endoløkke, skal du opdatere din kode på følgende måde:do { try { // Calculate the sum of the even numbers between the bounds averageValue = AverageOfEvenNumbers(lowerBound, upperBound); // Display the result to the user Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}."); } catch (ArgumentOutOfRangeException ex) { } }Der kræves et
whileudtryk for at definere afslutningsbetingelsen for endoløkke. Det er svært at angive betingelsen, før indholdet afdokodeblokken er defineret. Hvis du fuldførercatchkodeblokken, kan du definere detwhileudtryk, der skal bruges.Hvis du vil forklare problemet for brugeren og hente en ny
upperBound, skal du opdatere kodeblokkencatchpå følgende måde:catch (ArgumentOutOfRangeException ex) { Console.WriteLine("An error has occurred."); Console.WriteLine(ex.Message); Console.WriteLine($"The upper bound must be greater than {lowerBound}"); Console.Write($"Enter a new upper bound: "); upperBound = int.Parse(Console.ReadLine()); }Den opdaterede
catchkodeblok beskriver problemet og kræver, at brugeren angiver en ny øvre grænse. Men hvad nu, hvis brugeren ikke har en gyldig øvre grænseværdi at angive? Hvad sker der, hvis brugeren skal afslutte løkken i stedet for at angive en værdi?Hvis du vil give brugeren mulighed for at afslutte løkken i stedet for at angive en ny øvre grænse, skal du opdatere kodeblokken
catchpå følgende måde:catch (ArgumentOutOfRangeException ex) { Console.WriteLine("An error has occurred."); Console.WriteLine(ex.Message); Console.WriteLine($"The upper bound must be greater than {lowerBound}"); Console.Write($"Enter a new upper bound (or enter Exit to quit): "); string? userResponse = Console.ReadLine(); if (userResponse.ToLower().Contains("exit")) { } else { upperBound = int.Parse(userResponse); } }Den opdaterede
catchkodeblok indeholder to stier, en "exit"-sti og en "ny øvre grænse"-sti.Brug et øjeblik på at overveje det udtryk,
whileder kræves til løkkendo.Hvis brugeren angiver "Afslut" ved prompten, skal koden afslutte løkken. Hvis brugeren angiver en ny øvre grænse, skal løkken fortsætte. Et
whileudtryk, der evaluerer en boolesk værdi, kan bruges. Eksempler:while (exit == false);Det foreslåede
whileudtryk etablerer følgende funktionsmåde:- løkken
dofortsætter med at gentage, så længe den booleskeexitværdi er lig medfalse. - løkken
dostopper gentagelsen, så snart den booleskeexitværdi er lig medtrue.
- løkken
Hvis du vil instantiere en boolesk variabel med navnet
exitog brugeexittil at angive afslutningsbetingelsen for løkkendo, skal du opdatere din kode på følgende måde:bool exit = false; do { try { // Calculate the sum of the even numbers between the bounds averageValue = AverageOfEvenNumbers(lowerBound, upperBound); // Display the result to the user Console.WriteLine($"The average of even numbers between {lowerBound} and {upperBound} is {averageValue}."); exit = true; } catch (ArgumentOutOfRangeException ex) { Console.WriteLine("An error has occurred."); Console.WriteLine(ex.Message); Console.WriteLine($"The upper bound must be greater than {lowerBound}"); Console.Write($"Enter a new upper bound (or enter Exit to quit): "); string? userResponse = Console.ReadLine(); if (userResponse.ToLower().Contains("exit")) { exit = true; } else { exit = false; upperBound = int.Parse(userResponse); } } } while (exit == false);Gem din opdaterede kode.
Vælg Start fejlfinding i menuen Kør.
Skift til terminalpanelet.
Ved prompten "nedre grænse" skal du skrive 3
Ved prompten "øvre grænse" skal du skrive 3
Bemærk, at følgende output vises i TERMINAL-panelet:
Enter the lower bound: 3 Enter the upper bound: 3 An error has occurred. ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound') The upper bound must be greater than 3 Enter a new upper bound (or enter Exit to quit):Angiv 11 ved prompten om en ny øvre grænse
Bemærk, at følgende output vises i TERMINAL-panelet:
Enter the lower bound: 3 Enter the upper bound: 3 An error has occurred. ArgumentOutOfRangeException: upper bound must be greater than lower bound. (Parameter 'upperBound') The upper bound must be greater than 3 Enter a new upper bound (or enter Exit to quit): 11 The average of even numbers between 3 and 11 is 7.Tryk på Enter for at afslutte programmet.
Tillykke! Du har udløst, fanget og håndteret en undtagelse.
Resumé
Her er et par vigtige ting, du skal huske fra dette undermodul:
- Sørg for, at fejlfindingsmiljøet er konfigureret til at understøtte dine programkrav.
- Metodekoden skal udløse en undtagelse, når der registreres et problem eller en betingelse.
- Undtagelser skal fanges på et niveau i opkaldsstakken, hvor de kan løses.