Introduction à la gestion des erreurs en C#
Dans toute application, en particulier dans les systèmes d'entreprise complexes sur la plateforme .NET, les erreurs sont inévitables. L'utilisateur peut saisir des données incorrectes, un fichier peut être inaccessible, ou une connexion réseau peut être interrompue. Au lieu de laisser le programme se terminer anormalement, un développeur compétent utilise le mécanisme de gestion des exceptions.
En C#, la base de ce mécanisme est la construction try/catch/finally. Cependant, les capacités du langage ne s'arrêtent pas là : il existe les instructions using et throw, ainsi que la possibilité de créer vos propres types d'exceptions. Dans cet article, nous allons détailler tous les aspects clés de la gestion des erreurs en C# (.NET), afin que votre code soit non seulement fiable, mais aussi lisible.
1. Construction de base : try, catch et finally
C'est le fondement par lequel commence la découverte des exceptions. Le bloc try contient le code qui peut potentiellement provoquer une erreur. Le bloc catch intercepte l'exception et la traite. Le bloc finally s'exécute toujours, qu'une erreur se soit produite ou non — il est idéal pour libérer des ressources (fermeture de fichiers, connexions).
Syntaxe et exemple
using System;using System.IO;
class Program{ static void Main() { try { Console.Write("Entrez le chemin du fichier : "); string path = Console.ReadLine(); string content = File.ReadAllText(path); Console.WriteLine("Contenu du fichier :"); Console.WriteLine(content); } catch (FileNotFoundException ex) { Console.WriteLine($"Erreur : Fichier non trouvé. {ex.Message}"); } catch (UnauthorizedAccessException ex) { Console.WriteLine($"Erreur : Accès au fichier refusé. {ex.Message}"); } catch (Exception ex) // Interception générale de toutes les autres exceptions { Console.WriteLine($"Erreur inconnue : {ex.Message}"); } finally { Console.WriteLine("Bloc finally exécuté. Libération des ressources (si nécessaire)."); } }}Points importants :
- L'ordre des blocs catch est important : il faut d'abord intercepter les exceptions les plus spécifiques (par exemple,
FileNotFoundException), puis les plus générales (Exception). Si vous placez un bloc général en premier, les blocs plus spécifiques ne seront jamais atteints. - Le bloc finally n'est pas obligatoire. Si vous n'avez pas besoin de libérer des ressources de manière garantie, vous pouvez l'omettre.
- N'interceptez pas
Exceptionsans nécessité. Si vous ne savez pas comment traiter une erreur, il est préférable de laisser le programme planter — cela aidera à identifier le problème lors du développement.
2. Libération des ressources avec using
Bien que finally soit un outil puissant, l'écrire à chaque fois pour des choses comme la fermeture de fichiers ou de connexions à la base de données est fastidieux. Pour les objets qui implémentent l'interface IDisposable, C# dispose de l'instruction using. Elle garantit l'appel de la méthode Dispose() à la sortie du bloc, même si une exception se produit.
Comparaison des approches
Sans using (libération manuelle) :
StreamReader reader = null;try{ reader = new StreamReader("data.txt"); string line = reader.ReadLine(); // ... travail avec reader}finally{ if (reader != null) reader.Dispose();}Avec using :
using (StreamReader reader = new StreamReader("data.txt")){ string line = reader.ReadLine(); // ... travail avec reader}// Dispose() sera appelé automatiquement