This article has been localized into French by the community.
Gestion des exceptions en WPF
Si vous êtes familier du langage C # ou l'un des autres langages .NET que vous pouvez utiliser avec WPF, la gestion des exceptions ne devrait pas être nouvelle pour vous: Chaque fois que vous avez un morceau de code susceptible de générer une exception, enveloppez-le dans un bloc try-catch pour gérer l'exception proprement. Considérons cet exemple:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Bien entendu, cela ne va pas fonctionner, puisque nous essayons d'exécuter la méthode Trim() sur une variable qui est actuellement nulle. Si vous ne gérez pas l'exception, votre application va planter et Windows devra gérer le problème. Comme vous pouvez le voir, ce n'est pas très convivial:
Dans ce cas, l'utilisateur sera forcé de fermer l'application à cause d'une erreur simple et facilement évitable. Si vous savez que le code ne va pas fonctionner, vous devriez utiliser un bloc try-catch comme ceci:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
}
Cependant, il arrive que le code le plus simple lève une exception, et plutôt que d'envelopper chaque ligne de code dans un bloc try-catch, WPF vous permet de gérer les exceptions de manière globale. Ceci s'effectue à l'aide de l'événement DispatcherUnhandledException de la classe Application. Si vous avez souscrit à cet événement, WPF va appeler la méthode enregistrée lorsqu'une exception non gérée est levée par votre code. Voici un exemple complet basé sur ce que nous venons de voir:
<Window x:Class="WpfTutorialSamples.WPF_Application.ExceptionHandlingSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="ExceptionHandlingSample" Height="200" Width="200">
<Grid>
<Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click">
Do something bad!
</Button>
</Grid>
</Window>
using System;
using System.Windows;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ExceptionHandlingSample : Window
{
public ExceptionHandlingSample()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
try
{
s.Trim();
}
catch(Exception ex)
{
MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
}
s.Trim();
}
}
}
Veuillez noter que nous appelons la méthode Trim() une seconde fois en dehors du bloc try-catch afin que le premier appel soit géré alors que le second ne l'est pas. Pour le second appel, nous avons besoin de la magie de App.xaml:
<Application x:Class="WpfTutorialSamples.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
DispatcherUnhandledException="Application_DispatcherUnhandledException"
StartupUri="WPF Application/ExceptionHandlingSample.xaml">
<Application.Resources>
</Application.Resources>
</Application>
using System;
using System.Windows;
namespace WpfTutorialSamples
{
public partial class App : Application
{
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Error);
e.Handled = true;
}
}
}
Nous gérons l'exception à peu près de la même manière que l'exception locale, mais avec une boîte de dialogue légèrement différente au niveau du texte et de l'image. Notez également que nous définissons la propriété e.Handled à true. Ceci indique à WPF que nous avons géré l'exception et que rien de plus ne doit être fait avec.
Résumé
La gestion des exceptions est un élément très important d'une application, et heureusement, WPF et .NET rendent cette gestion très simple, qu'il s'agisse d'une gestion locale ou globale. Vous devriez gérer les exceptions de manière locale lorsque cela a du sens et n'utiliser la gestion globale que comme une solution de secours, car la gestion locale vous permet de préciser le type d'exception à gérer et donc de traiter le problème de manière plus spécialisée.