'>

La gestion des exceptions de C sharp

De nombreuses fonctions C# sont susceptibles de générer des exceptions, c'est à dire des erreurs. Lorsqu'une fonction est
susceptible de générer une exception, le programmeur devrait la gérer dans le but d'obtenir des programmes plus résistants aux
erreurs : il faut toujours éviter le "plantage" sauvage d'une application.
La gestion d'une exception se fait selon le schéma suivant :
try{
code susceptible de générer une exception
} catch (Exception e){
traiter l'exception e
}
instruction suivante
Si la fonction ne génère pas d'exception, on passe alors à instruction suivante, sinon on passe dans le corps de la clause catch puis à
instruction suivante. Notons les points suivants :
• e est un objet de type Exception ou dérivé. On peut être plus précis en utilisant des types tels que IndexOutOfRangeException,
FormatException, SystemException, etc… : il existe plusieurs types d'exceptions. En écrivant catch (Exception e), on indique qu'on
veut gérer toutes les types d'exceptions. Si le code de la clause try est susceptible de générer plusieurs types d'exceptions, on
peut vouloir être plus précis en gérant l'exception avec plusieurs clauses catch :
try{
code susceptible de générer les exceptions
} catch ( IndexOutOfRangeException e1){
traiter l'exception e1
}
} catch ( FormatException e2){
traiter l'exception e2
}
instruction suivante
• On peut ajouter aux clauses try/catch, une clause finally :
try{
code susceptible de générer une exception
} catch (Exception e){
traiter l'exception e
}
finally{
code exécuté après try ou catch
}
instruction suivante
Qu'il y ait exception ou pas, le code de la clause finally sera toujours exécuté.
• Dans la clause catch, on peut ne pas vouloir utiliser l'objet Exception disponible. Au lieu d'écrire catch (Exception e){..}, on écrit
alors catch(Exception){...} ou plus simplement catch {...}.
• La classe Exception a une propriété Message qui est un message détaillant l'erreur qui s'est produite. Ainsi si on veut afficher
celui-ci, on écrira :
catch (Exception ex){
Console.WriteLine("L'erreur suivante s'est produite : {0}",ex.Message);
...
}//catch
• La classe Exception a une méthode ToString qui rend une chaîne de caractères indiquant le type de l'exception ainsi que la
valeur de la propriété Message. On pourra ainsi écrire :
catch (Exception ex){
Console.WriteLine("L'erreur suivante s'est produite : {0}", ex.ToString());
...
}//catch
On peut écrire aussi :
catch (Exception ex){
Console.WriteLine("L'erreur suivante s'est produite : {0}",ex);
...
}//catch
Le compilateur va attribuer au paramètre {0}, la valeur ex.ToString().
L'exemple suivant montre une exception générée par l'utilisation d'un élément de tableau inexistant :
1. using System;
2.
3. namespace Chap1 {
4. class P08 {
5. static void Main(string[] args) {
6. // déclaration & initialisation d'un tableau
7. int[] tab = { 0, 1, 2, 3 };
8. int i;
9. // affichage tableau avec un for
10. for (i = 0; i < tab.Length; i++)
11. Console.WriteLine("tab[{0}]={1}", i, tab[i]);
12. // affichage tableau avec un for each
13. foreach (int élmt in tab) {
14. Console.WriteLine(élmt);
15. }
16. // génération d'une exception
17. try {
18. tab[100] = 6;
19. } catch (Exception e) {
20. Console.Error.WriteLine("L'erreur suivante s'est produite : " + e);
21. return;
22. }//try-catch
23. finally {
24. Console.WriteLine("finally ...");
25. }
26. }
27. }
28.}
Ci-dessus, la ligne 18 va générer une exception parce que le tableau tab n'a pas d'élément n° 100. L'exécution du programme donne
les résultats suivants :
1. tab[0]=0
2. tab[1]=1
3. tab[2]=2
4. tab[3]=3
5. 0
6. 1
7. 2
8. 3

9. L'erreur suivante s'est produite : System.IndexOutOfRangeException: L'index se trouve en dehors
des limites du tableau.
10.   à Chap1.P08.Main(String[] args) dans C:\data\travail\2007-2008\c#
2008\poly\Chap1\08\Program.cs:ligne 7
11.finally ...
• ligne 9 : l'exception [System.IndexOutOfRangeException] s'est produite
• ligne 11 : la clause finally (lignes 23-25) du code a été exécutée, alors même que ligne 21, on avait une instruction return
pour sortir de la méthode. On retiendra que la clause finally est toujours exécutée.
Voici un autre exemple où on gère l'exception provoquée par l'affectation d'une chaîne de caractères à un variable de type entier
lorsque la chaîne ne représente pas un nombre entier :
1. using System;
2.
3. namespace Chap1 {
4. class P08 {
5. static void Main(string[] args) {
6.
7. // exemple 2
8. // On demande le nom
9. Console.Write("Nom : ");
10. // lecture réponse
11. string nom = Console.ReadLine();
12. // on demande l'âge
13. int age = 0;
14. bool ageOK = false;
15. while (!ageOK) {
16. // question
17. Console.Write("âge : ");
18. // lecture-vérification réponse
19. try {
20. age = int.Parse(Console.ReadLine());
21. ageOK = age>=1;
22. } catch {
23. }//try-catch
24. if (!ageOK) {
25. Console.WriteLine("Age incorrect, recommencez...");
 26. }
27. }//while
28. // affichage final
29. Console.WriteLine("Vous vous appelez {0} et vous avez {1} an(s)",nom,age);
30. }
31. }
32.}
• lignes 15-27 : la boucle de saisie de l'âge d'une personne
• ligne 20 : la ligne tapée au clavier est transformée en nombre entier par la méthode int.Parse. Cette méthode lance une
exception si la conversion n'est pas possible. C'est pourquoi, l'opération a été placée dans un try / catch.
• lignes 22-23 : si une exception est lancée, on va dans le catch où rien n'est fait. Ainsi, le booléen ageOK positionné à false,
ligne 14, va-t-il rester à false.
• ligne 21 : si on arrive à cette ligne, c'est que la conversion string -> int a réussi. On vérifie cependant que l'entier obtenu
est bien supérieur ou égal à 1.
• lignes 24-26 : un message d'erreur est émis si l'âge est incorrect.
Quelques résultats d'exécution :
1. Nom : dupont
2. âge : 23
3. Vous vous appelez dupont et vous avez 23 an(s)
4. Nom : durand
5. âge : x
6. Age incorrect, recommencez...
7. âge : -4
8. Age incorrect, recommencez...
9. âge : 12
10.Vous vous appelez durand et vous avez 12 an(s)



Publié par Drupal french Study