mardi 18 mars 2014

13 - Gérer les exceptions

0 commentaires

Les exceptions sont des erreurs qui surviennent lorsque quelque chose ne va pas lors de l'exécution.
Lorsqu'une exception non gérée se produit, elle entraîne en général la fermeture du programme par votre OS (système d'exploitation).
Pensez à ceux qui utiliseront vos programmes (ne serait-ce qu'à vous-mêmes) ! Imaginez qu'à cause d'une erreur interne, le programme est fermé et manque de chance vous n'aviez pas sauvegardé : c'est pour le moins agaçant.
Gérer les exceptions permet de rendre votre programme plus stable et c'est un moyen simple pour éviter de se mettre des utilisateurs à dos.

Lancer une exception

Une exception est comme une alerte, le but est d'éviter une mauvaise opération. L'intérêt de lancer une exception est que du code ait été prévu pour la gérer, sinon votre programme s'arrête brutalement. Vous pouvez vous-mêmes lancer des exceptions, lorsque vous jugez que c'est nécessaire.
Pour ce faire, il suffit de faire throw new nomDeLexception();. Vous pouvez aussi passer des paramètres au constructeur comme l'IntelliSense vous le suggère, par exemple :
1throw new NotImplementedException("Le code n'a pas encore écrit !");

Intercepter une exception

Lorsque vous voulez exécuter du code susceptible d'être source d'erreur, enfermez-le dans un bloc try.
Vous pouvez intercepter l'exception avec un (ou plusieurs) bloc(s) catch.
Enfin, vous pouvez utiliser un bloc finally pour effectuer systématiquement une opération après la tentative d'exécution.
1try
2{
3    Console.Write("Entrez un nombre : ");
4    int n = int.Parse(Console.ReadLine());
5    Console.WriteLine(
6        "100/nombre = {0}",
7        100/n);
8}
9catch (DivideByZeroException dbzEx)
10{
11    Console.WriteLine("Erreur : division par zéro.");
12}
13catch (Exception ex)
14{
15    Console.WriteLine(
16        "Une autre exception a eu lieu : {0}.",
17        ex.Message);
18}
19finally
20{
21    Console.WriteLine("Quel que soit le résultat, ceci est affiché.");
22}
Ainsi, comme nous n'utilisons pas dbzEx dans l'exemple précédent, nous pouvons simplement écrirecatch (DivideByZeroException) au lieu de catch (DivideByZeroException dbzEx).
Pour créer vos propres exceptions, vous devez créer une classe qui dérive de la classe Exception. Voici un exemple :
1public class MyException : Exception
2{
3    DateTime m_errorTime;
4    static ushort s_errorNumber;
5
6    public MyException()
7        : base("Message par défaut de l'exception.")
8    {
9        m_errorTime = DateTime.Now;
10        s_errorNumber++;
11    }
12
13    public MyException(string message) 
14        : base(message)
15    {
16        m_errorTime = DateTime.Now;
17        s_errorNumber++;
18    }
19
20    public void DisplayError()
21    {
22        MessageBox.Show(
23            base.Message,
24            string.Format(
25                "Erreur n°{0} survenue à {1}.",
26                s_errorNumber,
27                m_errorTime.ToLongTimeString()),
28            MessageBoxButtons.OK,
29            MessageBoxIcon.Error);
30    }
31}
Ainsi, vous pouvez faire :
1try
2{
3    // Code dangereux
4}
5catch (MyException ex)
6{
7    ex.DisplayError();
8}

Leave a Reply