Documente Academic
Documente Profesional
Documente Cultură
Dans le programme principal (méthode Main() de la classe Program), instancier un objet gaston de la classe
GastonLagaffe puis demande à gaston de trier 2 lettres :
static void Main(string[] args)
{ GastonLagaffe gaston = new GastonLagaffe();
Console.WriteLine("Debout Gaston ! Il faut trier le courrier !");
gaston.trierCourrierEnRetard(2);
Console.ReadKey();
}
1
SI6-TP4 2
Placer un point d'arrêt sur la première instruction de la méthode trierCourrierEnRetard( ) en cliquant dans la
marge
A l’aide de la touche F11, avancer instruction par instruction… suivre le déroulement du tri du courrier avec 2
lettres. Puis pour 3 lettres…
Avancer jusqu’à… la condition. Cette condition a déclenché une levée d’exception. A noter : Pas d’exécution
de l’affichage de « ouf, j’ai fini. »
Modifier le bloc catch de la méthode trierCourrierEnRetard() pour afficher plus de détails sur l'exception
interceptée.
catch (Exception e)
{ Console.WriteLine("M'enfin ! " + e.Message);
Console.WriteLine("Détails : " + e.ToString());
}
Modifier le programme principal afin de tester cette méthode (mettre en commentaire la 1ère méthode),
// gaston.trierCourrierEnRetard(2);
// gaston.trierCourrierEnRetard(3);
gaston.rangerBureau();
on s’y attendait !
Mais aussi
Le message « Exception non gérée » est affiché car, à l’exécution, aucun bloc try { } n’a été détecté en amont qui
indiquerait la possibilité d’avoir des exceptions.
Ajouter un bloc try et un bloc catch dans la méthode rangerBureau() pour obtenir :
3
SI6-TP4 4
Dans l'exemple précédent, une exception levée depuis une méthode a été interceptée dans cette même méthode.
Découvrons ce qui se produit, quand une exception est levée lors d'appels de méthodes en cascade : cas le plus
fréquent !
L'exception levée dans la méthode allumerImprimante() a été propagée par la méthode imprimerContrats() puis
finalement interceptée dans le bloc catch de la méthode faireSignerContrats() :
4
SI6-TP4 5
Une exception levée remonte la chaîne des appels dans l'ordre inverse, jusqu'à être interceptée dans un bloc
catch. Dans le cas où aucun gestionnaire d'exception n'est trouvé, l'exécution du programme s'arrête avec un
message d'erreur.
5
SI6-TP4 6
Ajouter à votre projet les classes ExceptionMenfin et ExceptionBof, dérivées de la classe mère Exception.
Décrire ces classes permet simplement la modification du message d'erreur de l'exception.
class ExceptionMenfin:Exception
{
public ExceptionMenfin(string Message) : base("M'enfin ! " + Message) { }
}
class ExceptionBof : Exception
{
public ExceptionBof(string Message) : base("Bof ! " + Message) { }
}
Ajouter à la classe principale (Program) la méthode ci-dessous (et pas dans la méthode statique)
private static void appeler(GastonLagaffe gaston, String appelant)
{ Console.WriteLine("Gaston, " + appelant + " au téléphone !");
try
{ gaston.repondreAuTelephone(appelant); }
catch (ExceptionMenfin e)
{ Console.WriteLine("Pas de réponse... Et pourquoi ?");
Console.WriteLine(e.Message);
}
catch (ExceptionBof e)
{
Console.WriteLine("Ca sonne toujours... vous dormez ou quoi ?");
Console.WriteLine(e.Message);
}
}
Lorsqu’une méthode spécifie plusieurs types d'exceptions, il est obligatoire de prendre en compte tous les cas
possibles lors d'un appel de cette méthode.
6
SI6-TP4 7
Remarque : comme les exceptions héritent toutes deux de la classe Exception, il est possible de simplifier l'appel en
interceptant (ou en spécifiant) uniquement Exception de par l’héritage de ces méthodes et ces propriétés.
// version 2 de appeler
private static void appeler(GastonLagaffe gaston, String appelant)
{ Console.WriteLine("Gaston, " + appelant + " au téléphone !");
try
{ gaston.repondreAuTelephone(appelant); }
catch (Exception e)
{ Console.WriteLine("Encore une bonne excuse, j'imagine ?");
Console.WriteLine(e.Message);
}
}
Le résultat de l'exécution est le suivant :
Afin de limiter le nombre de blocs catch, il est intéressant d’intercepter les exceptions décrites par une classe mère
commune à ces exceptions : en particulier, quand le traitement de l'erreur est identique dans tous les catch.
Dans l'exemple précédent, savoir si l'exception interceptée est une ExceptionMenfin ou une ExceptionBof n’a
aucune importance.
Le compilateur signale une erreur : aucun intérêt d’un try sans lever d’exception par un catch.
En effet, sans définition d’un catch dans la méthode preparerJournal(), aucune remontée d’erreur ne peut se
produire dans la méthode appelante commanderFournitures(). L’exception aurait été avalée (en anglais
d'"exception swallowing").
7
SI6-TP4 8
Evitons ce genre de situation ; utilisons une clause optionnelle en plus du try ... catch : la clause finally. Le code
placé dans un bloc finally s'exécute dans tous les cas, même si une exception a été levée dans le bloc try.
8
SI6-TP4 9
Le code du bloc finally (ici, éteindre la cafetière) a été exécuté que l'exception soit levée ou non.