Exercice - Créer et lever une exception
Les développeurs doivent souvent créer et lever des exceptions à partir d’une méthode, puis intercepter ces exceptions plus loin dans la pile des appels où elles peuvent être gérées. La gestion des exceptions vous permet de garantir la stabilité de vos applications.
Dans cet exercice, vous allez commencer par un exemple d’application qui inclut une condition d’erreur potentielle à l’intérieur d’une méthode appelée. Votre méthode mise à jour lancera throw une exception lorsqu’elle détecte le problème. L’exception est gérée dans un catch bloc du code qui appelle la méthode. Le résultat est une application qui offre une meilleure expérience utilisateur.
Créer un projet de code
La première étape consiste à créer un projet de code que vous pouvez utiliser pendant ce module.
Ouvrez une nouvelle instance de Visual Studio Code.
Dans le menu Fichier, sélectionnez Ouvrir le dossier.
Dans la boîte de dialogue Ouvrir le dossier , accédez à votre dossier Windows Desktop .
Dans la boîte de dialogue Ouvrir le dossier , sélectionnez Nouveau dossier.
Nommez le nouveau dossier ThrowExceptions101, puis sélectionnez Sélectionner un dossier.
Dans le menu Terminal, sélectionnez Nouveau terminal.
Vous utiliserez une commande CLI .NET pour créer une application console.
À l’invite de commandes du panneau TERMINAL, entrez la commande suivante :
dotnet new consoleFermez le panneau TERMINAL.
Passer en revue un exemple d’application
Procédez comme suit pour charger et examiner un exemple d’application.
Ouvrez le fichier Program.cs.
Dans le menu Affichage, sélectionnez Palette de commandes.
À l’invite de commandes, entrez .net: g et sélectionnez .NET : Générer des ressources pour Build et Debug.
Remplacez le contenu du fichier Program.cs par le code suivant :
// 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; }Prenez le temps de passer le code en revue.
Notez que l’application effectue les tâches suivantes :
Les instructions de niveau supérieur utilisent des instructions
Console.ReadLine()pour obtenir des valeurs pourlowerBoundetupperBound.Les instructions de niveau supérieur passent
lowerBoundetupperBounden tant qu’arguments lors de l’appel de laAverageOfEvenNumbersméthode.La
AverageOfEvenNumbersméthode effectue les tâches suivantes :- Déclare les variables locales utilisées dans les calculs.
- Utilise une
forboucle pour additionner les nombres pairs entrelowerBoundetupperBound. La somme est stockée danssum. - Compte le nombre de nombres inclus dans la somme. Le nombre est stocké dans
count. - Stocke la moyenne des nombres additionnés dans une variable nommée
average. La valeur deaverageest retournée.
Les instructions de niveau supérieur affichent sur la console la valeur retournée par
AverageOfEvenNumbers, puis suspendent l'exécution.
Configurez l’environnement de débogage
L’exemple d’application lit l’entrée utilisateur à partir de la console. Le panneau CONSOLE DE DÉBOGAGE ne prend pas en charge la lecture d’entrées à partir de la console. Vous devez mettre à jour le fichier launch.json avant de pouvoir exécuter cette application dans le débogueur.
Utilisez la vue EXPLORATEUR pour ouvrir le fichier launch.json.
Dans le fichier launch.json, mettez à jour l’attribut
consolecomme suit :// For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console "console":"integratedTerminal",La valeur par défaut de l’attribut
consoleestinternalConsole, qui s’aligne sur le panneau CONSOLE DE DÉBOGAGE. Malheureusement, le panneau CONSOLE DEBUG ne prend pas en charge l’entrée de la console. Le paramètreintegratedTerminals’aligne sur le panneau TERMINAL, qui prend en charge l’entrée et la sortie de la console.Enregistrez vos modifications dans le fichier launch.json, puis fermez le fichier.
Dans le menu Exécuter de Visual Studio Code, sélectionnez Lancer le débogage.
Basculez sur le panneau TERMINAL.
À l’invite « limite inférieure », entrez 3
À l’invite « limite supérieure », entrez 11
Notez que l’application affiche le message suivant, puis s’interrompt :
The average of even numbers between 3 and 11 is 7.Pour quitter l’application, appuyez sur Entrée.
Lever une exception dans la méthode AverageOfEvenNumbers
La AverageOfEvenNumbers méthode attend une limite supérieure qui est plus grande que la limite inférieure. Une DivideByZero erreur se produit si la limite inférieure est supérieure ou égale à la limite supérieure.
Vous devez mettre à jour la AverageOfEvenNumbers méthode pour lever une exception lorsque la limite inférieure est supérieure ou égale à la limite supérieure.
Prenez une minute pour prendre en compte la façon dont vous souhaitez résoudre le problème.
Une option consiste à envelopper le calcul de
averagedans un bloc de codetryet à effectuer uncatchde l’exceptionDivideByZerolorsqu’elle se produit. Vous pouvez relancer l’exception, puis la gérer dans le code appelant.Une autre option consiste à évaluer les paramètres d’entrée avant de démarrer les calculs. Si
lowerBoundest supérieur ou égal àupperBound, vous pouvez déclencher une exception.L’évaluation des paramètres et la levée d’une exception avant de commencer les calculs est le meilleur choix.
Déterminez le type d’exception à lever.
Il existe deux types d’exceptions qui s’alignent sur le problème :
ArgumentOutOfRangeException- Un type d’exceptionArgumentOutOfRangeExceptionne doit être levée que lorsque la valeur d’un argument se trouve en dehors de la plage autorisée de valeurs telle que définie par la méthode appelée. Bien queAverageOfEvenNumbersne définisse pas explicitement une plage autorisée pourlowerBoundouupperBound, la valeur delowerBoundimplique la plage autorisée pourupperBound.InvalidOperationException: un type d’exceptionInvalidOperationExceptionne doit être levée que lorsque les conditions d’exploitation d’une méthode ne prennent pas en charge la réussite d’un appel de méthode particulier. Dans ce cas, les conditions d’exploitation sont établies par les paramètres d’entrée de la méthode.
Lorsque vous avez deux types d’exceptions ou plus à choisir, sélectionnez le type d’exception qui correspond au problème de façon plus étroite. Dans ce cas, les deux types d’exceptions sont alignés sur le problème de façon égale.
Lorsque vous avez deux types d’exceptions ou plus alignés sur le problème de façon égale, sélectionnez le type d’exception le plus étroitement délimité. Le
ArgumentOutOfRangeExceptiontype d’exception est limité aux arguments passés à la méthode. LeInvalidOperationExceptiontype d’exception est limité aux conditions d’exploitation de la méthode. Dans ce cas, leArgumentOutOfRangeExceptiontype d’exception est plus limité que le type d’exceptionInvalidOperationException.La
AverageOfEvenNumbersméthode doit lever uneArgumentOutOfRangeExceptionexception.Au début de la méthode
AverageOfEvenNumbers, pour détecter le problème de limite supérieure, mettez à jour votre code comme suit :if (lowerBound >= upperBound) { } int sum = 0;Pour créer et lever une
ArgumentOutOfRangeExceptionexception, mettez à jour le bloc deifcode comme suit :if (lowerBound >= upperBound) { throw new ArgumentOutOfRangeException("upperBound", "ArgumentOutOfRangeException: upper bound must be greater than lower bound."); }Cette ligne de code initialise une nouvelle instance de la
ArgumentOutOfRangeExceptionclasse avec le nom du paramètre d’entrée qui provoque l’exception et un message d’erreur spécifié.
Intercepter l’exception dans le code appelant
Dans la mesure du possible, les exceptions doivent être interceptées au niveau de la pile des appels où elles peuvent être gérées. Dans cet exemple d’application, les paramètres de la AverageOfEvenNumbers méthode peuvent être gérés dans la méthode appelante (instructions de niveau supérieur).
Faites défiler vers le haut jusqu’aux déclarations de niveau supérieur.
Pour placer l’appel de méthode
AverageOfEvenNumberset l’instructionConsole.WriteLineà l’intérieur d’un bloc de codetry, mettez à jour votre code comme suit :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}."); }Pour créer la clause associée
catch, entrez le code suivant :catch(ArgumentOutOfRangeException ex) { }Prenez une minute pour prendre en compte la façon dont vous pouvez gérer l’exception.
Pour gérer cette exception, votre code doit effectuer les opérations suivantes :
- Expliquer le problème à l’utilisateur.
- Obtenez une nouvelle valeur pour
upperBound. - Appelez
AverageOfEvenNumbersen utilisant le nouveauupperBound. - Passez à l’exception
catchsi le nouveauupperBoundfourni est toujours inférieur ou égal àlowerBound.
Le fait de continuer à effectuer un
catchsur l’exception nécessite une boucle. Étant donné que vous souhaitez appeler laAverageOfEvenNumbersméthode au moins une fois, unedoboucle doit être utilisée.Pour placer les blocs
tryetcatchà l'intérieur d'une boucledo, mettez à jour votre code comme suit :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) { } }Une
whileexpression est requise pour définir la condition de sortie d’unedoboucle. Il est difficile de spécifier la condition avant la définition du contenu du bloc dedocode. Finir le bloc de codecatchvous aidera à définir l’expressionwhilenécessaire.Pour expliquer le problème à l'utilisateur et obtenir un nouveau
upperBound, mettez à jour votre bloc de codecatchcomme suit :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()); }Le bloc de code mis à jour
catchdécrit le problème et exige que l’utilisateur entre une nouvelle limite supérieure. Toutefois, que se passe-t-il si l’utilisateur n’a pas de valeur limite supérieure valide à entrer ? Que se passe-t-il si l’utilisateur doit quitter la boucle plutôt que d’entrer une valeur ?Pour permettre à l’utilisateur de quitter la boucle plutôt que d’entrer une nouvelle limite supérieure, mettez à jour votre
catchbloc de code comme suit :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); } }Le bloc de code mis à jour
catchcomprend deux chemins, un chemin « sortie » et un chemin « nouvelle limite supérieure ».Prenez une minute pour prendre en compte l’expression
whilerequise pour ladoboucle.Si l’utilisateur entre « Exit » à l’invite, le code doit quitter la boucle. Si l’utilisateur entre une nouvelle limite supérieure, la boucle doit continuer. Expression
whilequi évalue une valeur booléenne peut être utilisée. Par exemple:while (exit == false);L’expression proposée
whileétablit le comportement suivant :- la
doboucle continue d’itérer tant que la valeur booléenneexitest égale àfalse. - la
doboucle arrête l’itération dès que la valeur booléenneexitest égale àtrue.
- la
Pour instancier une variable booléenne nommée
exitet utiliserexitpour définir la condition de sortie de ladoboucle, mettez à jour votre code comme suit :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);Enregistrez votre code mis à jour.
Dans le menu Exécuter, sélectionnez Démarrer le débogage.
Basculez sur le panneau TERMINAL.
À l’invite « limite inférieure », entrez 3
À l’invite « limite supérieure », entrez 3
Notez que la sortie suivante s’affiche dans le panneau TERMINAL :
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):À l'invite de saisie d'une nouvelle limite supérieure, entrez 11
Notez que la sortie suivante s’affiche dans le panneau TERMINAL :
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.Pour quitter l’application, appuyez sur Entrée.
Félicitations! Vous avez réussi à lever, intercepter et gérer une exception.
Récapitulatif
Voici quelques points importants à retenir de cette unité :
- Vérifiez que votre environnement de débogage est configuré pour prendre en charge les exigences de votre application.
- Le code de méthode doit lever une exception lorsqu’un problème ou une condition est détecté.
- Les exceptions doivent être interceptées à un niveau de la pile des appels où elles peuvent être résolues.