WPF - Gestion des exceptions

Une exception est une condition d'erreur ou un comportement inattendu qui se produit pendant l'exécution d'un programme. Des exceptions peuvent être soulevées pour de nombreuses raisons, certaines d'entre elles sont les suivantes -

  • Défaut dans votre code ou dans le code que vous appelez (comme une bibliothèque partagée),

  • Ressources du système d'exploitation non disponibles,

  • Conditions inattendues rencontrées par un Common Language Runtime (comme du code qui ne peut pas être vérifié)

Syntaxe

Les exceptions ont la capacité de transférer le flux d'un programme d'une partie à une autre. Dans le framework .NET, la gestion des exceptions comporte les quatre mots clés suivants:

  • try - Dans ce bloc, le programme identifie une certaine condition qui soulève une exception.

  • catch- Le mot clé catch indique la capture d'une exception. UNEtry bloc est suivi d'un ou plusieurs catch blocs pour intercepter une exception avec un gestionnaire d'exceptions à l'endroit dans un programme où vous souhaitez gérer le problème.

  • finally- Le bloc finally est utilisé pour exécuter un ensemble d'instructions donné, qu'une exception soit levée ou non. Par exemple, si vous ouvrez un fichier, il doit être fermé, qu'une exception soit déclenchée ou non.

  • throw- Un programme lève une exception lorsqu'un problème apparaît. Ceci est fait en utilisant un mot-clé throw.

La syntaxe pour utiliser ces quatre mots-clés est la suivante -

try { 
   ///This will still trigger the exception 
} 
catch (ExceptionClassName e) { 
   // error handling code 
} 
catch (ExceptionClassName e) { 
   // error handling code
}
catch (ExceptionClassName e) { 
   // error handling code 
} 
finally { 
   // statements to be executed 
}

Plusieurs instructions catch sont utilisées dans les cas où un bloc try peut déclencher plusieurs exceptions selon la situation d'un flux de programme.

Hiérarchie

Presque toutes les classes d'exception dans le framework .NET sont directement ou indirectement dérivées de la classe Exception. Les classes d'exceptions les plus importantes dérivées de la classe Exception sont -

  • ApplicationException class- Il prend en charge les exceptions générées par les programmes. Lorsque le développeur souhaite définir une exception, la classe doit être dérivée de cette classe.

  • SystemException class- Il s'agit de la classe de base pour toutes les exceptions système d'exécution prédéfinies. La hiérarchie suivante montre les exceptions standard fournies par le runtime.

Le tableau suivant répertorie les exceptions standard fournies par le runtime et les conditions dans lesquelles vous devez créer une classe dérivée.

Type d'exception Type de base La description
Exception Objet Classe de base pour toutes les exceptions.
SystemException Exception Classe de base pour toutes les erreurs générées par l'exécution.
IndexOutOfRangeException SystemException Lancé par le runtime uniquement lorsqu'un tableau est mal indexé.
NullReferenceException SystemException Lancé par le runtime uniquement lorsqu'un objet nul est référencé.
AccessViolationException SystemException Lancé par le runtime uniquement en cas d'accès à une mémoire non valide.
InvalidOperationException SystemException Lancé par des méthodes dans un état non valide.
ArgumentException SystemException Classe de base pour toutes les exceptions d'argument.
ArgumentNullException ArgumentException Lancé par des méthodes qui n'autorisent pas un argument à être nul.
ArgumentOutOfRangeException ArgumentException Lancé par des méthodes qui vérifient que les arguments sont dans une plage donnée.
ExternalException SystemException Classe de base pour les exceptions qui se produisent ou sont ciblées sur des environnements en dehors du runtime.
SEHException Exception externe Exception encapsulant les informations de gestion des exceptions structurées Win32.

Exemple

Prenons un exemple simple pour mieux comprendre le concept. Commencez par créer un nouveau projet WPF avec le nomWPFExceptionHandling.

Faites glisser une zone de texte de la boîte à outils vers la fenêtre de conception. Le code XAML suivant crée une zone de texte et l'initialise avec certaines propriétés.

<Window x:Class = "WPFExceptionHandling.MainWindow" 
   xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006" 
   xmlns:local = "clr-namespace:WPFExceptionHandling"
   mc:Ignorable = "d" 
   Title = "MainWindow" Height = "350" Width = "604">
	
   <Grid> 
      <TextBox x:Name = "textBox" HorizontalAlignment = "Left"
         Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap" 
         VerticalAlignment = "Top" Width = "453"/> 
   </Grid> 
	
</Window>

Voici la lecture du fichier avec la gestion des exceptions en C #.

using System; 
using System.IO; 
using System.Windows;

namespace WPFExceptionHandling { 

   public partial class MainWindow : Window { 
	
      public MainWindow() { 
         InitializeComponent(); 
         ReadFile(0); 
      }
		
      void ReadFile(int index) { 
         string path = @"D:\Test.txt"; 
         StreamReader file = new StreamReader(path); 
         char[] buffer = new char[80]; 
			
         try { 
            file.ReadBlock(buffer, index, buffer.Length); 
            string str = new string(buffer); 
            str.Trim(); 
            textBox.Text = str; 
         }
         catch (Exception e) {
            MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
         } 
         finally { 
            if (file != null) { 
               file.Close(); 
            } 
         } 
      } 
   } 
}

Lorsque vous compilez et exécutez le code ci-dessus, il produira la fenêtre suivante dans laquelle un texte est affiché à l'intérieur de la zone de texte.

Lorsqu'une exception est levée ou que vous la lancez manuellement (comme dans le code suivant), une boîte de message contenant une erreur s'affiche.

using System; 
using System.IO; 
using System.Windows;

namespace WPFExceptionHandling {
 
   public partial class MainWindow : Window {
	
      public MainWindow() { 
         InitializeComponent(); 
         ReadFile(0); 
      } 
		
      void ReadFile(int index) { 
         string path = @"D:\Test.txt"; 
         StreamReader file = new StreamReader(path); 
         char[] buffer = new char[80]; 
			
         try { 
            file.ReadBlock(buffer, index, buffer.Length); 
            string str = new string(buffer); 
            throw new Exception(); 
            str.Trim(); 
            textBox.Text = str; 
         }
         catch (Exception e) { 
            MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message); 
         } 
         finally { 
            if (file != null) { 
               file.Close(); 
            } 
         } 
      } 
   } 
}

Lorsqu'une exception est déclenchée lors de l'exécution du code ci-dessus, le message suivant s'affiche.

Nous vous recommandons d'exécuter le code ci-dessus et d'expérimenter ses fonctionnalités.