Lorsqu’on appelle une méthode en C#, on n’est pas toujours sur que l’exécution se déroulera comme prévue. Par exemple, si on essaye d’accéder à un fichier qui n’existe pas. Le framework .NET utilise les exceptions pour gérer ces comportements inattendus. Une application bien construite doit correctement gérer les exceptions pour éviter aux utilisateurs des fermetures inopinées.
Généralités sur les exceptions
Lorsqu’une erreur a lieu au sein d’une application, une exception est levée. Cet objet contient toutes les informations décrivant l’erreur.
int a = int.Parse("toto");
La code ci-dessus va lever une exception FormatException, car la chaîne de caractères "toto" ne peut être convertie en entier. Une telle ligne de code met fin à l’exécution de notre programme, car elle n’est pas gérée. Pour éviter cela, il faut entourer notre code de try/catch de la manière suivante.
try { int a = int.Parse("toto"); int a = int.Parse("2"); } catch { Console.WriteLine("Erreur lors de l'appel à la méthode Parse."); }
Il faut mettre le code susceptible de lever une exception dans la section try. Si une erreur se produit, l’exécution entre dans le catch sans poursuivre l’exécution du code restant dans le try. Dans notre exemple, la ligne int a = int.Parse("toto"); ayant levé une exception la ligne suivante int a = int.Parse("2"); ne s’exécutera pas. On passera directement à la ligne Console.WriteLine("Erreur lors de l’appel à la méthode Parse.");
Il est possible préciser le type d’exception qu’on veut catcher. Dans ce cas, il faut préciser le type de l’exception dans le catch.
catch (FormatException) { ... }
Si on veut accéder à l’objet représentant l’exception, on peut ajouter une variable dans notre catch. Par exemple,
catch (FormatException ex) { Console.WriteLine($"exception levée avec le message {ex.Message}"); }
Après l’exécution du bloc catch, notre programme se termine. Il se peut qu’on veuille qu’un bout de code s’exécute après notre bloc try qu’il y ait une erreur ou pas. C’est là qu’intervient le bloc finally. Présent après le bloc catch, le code contenu dans cette section s’exécute toujours.
Console.WriteLine("Entrer un nombre"); string s = Console.ReadLine(); try { int i = int.Parse(s); } catch { Console.WriteLine("Caractère incorrect en entrée"); } finally { Console.WriteLine("Fin"); }
Lever explicitement une exception
Lorsque le développeur veut signaler une erreur au système, il peut lever volontairement une exception. Pour cela, il suffit d’instancier une nouvelle exception précédée du mot clé throw.
int j = 0; if(j<=0)throw new Exception("N doit être supérieur à 0");
Dans le catch, il est possible de lever expliciter une exception de plusieurs façons.
- en utilisant tout simplement throw;
catch { throw; }
Dans ce cas, l’exception de départ sera levée sans modification. On garde la pile des appels.
- en utilisant la variable de l’exception
catch (Exception ex) { throw ex; }
La pile des appels est réinitialisée à la position actuelle du code.
En général, pour conserver un maximum d’information pour le débogage, on privilégie le simple throw.
Par exemple dans le code suivant:
static void Main(string[] args) { try { machin(); } catch(Exception ex) { //throw ex; //throw; } finally { Console.WriteLine("Fin"); } } static void machin() { int i = int.Parse("s"); }
Avec throw on aura la pile des appels depuis la ligne int i = int.Parse("s").
à System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
à System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
à System.Int32.Parse(String s)
à ConsoleApp6.Program.machin() dans C:\ConsoleApp6\Program.cs:ligne 37
à ConsoleApp6.Program.Main(String[] args) dans C:\ConsoleApp6\Program.cs:ligne 25
alors qu’avec throw ex: on aura que la ligne où il y a throw ex.
à ConsoleApp6.Program.Main(String[] args) dans C:\ConsoleApp6\Program.cs:ligne 24
Créer une exception personnalisée
Le framework .NET fournit de nombreuses exceptions. Par exemple:
- IndexOutOfRangeException: lorsqu’on utilise un indice inférieur à 0 ou supérieur à la taille d’un tableau pour accéder à une valeur.
- NullReferenceException: lorsqu’on tente d’accéder à un objet null.
Vous pouvez trouver la liste complète en ligne. L’idéal serait d’utiliser les exceptions existantes mais il est possible de créer ses propres exceptions. Il suffit pour cela de créer une classe qui hérite de System.Exception.
Par convention, le nom de la classe doit avoir Exception pour suffixe.
public class ConnexionException:Exception { public ConnexionException(string message): base(message) { this.HelpLink = "http://www.monsite.com/help"; } }
Cet article contient l’essentiel de ce qu’il faut savoir pour gérer et utiliser les exceptions. Pour aller plus loin, vous pouvez visiter le site officiel de Microsoft.
Laisser un commentaire