This article has been localized into Italian by the community.
Gestire le eccezioni in WPF
Se hai familiarità con C # o con qualsiasi altro linguaggio .NET che puoi utilizzare con WPF, la gestione delle eccezioni non dovrebbe essere nuova per te: ogni volta che hai una parte di codice che probabilmente genera un'eccezione, dovresti racchiuderlo in un blocco try-catch per gestire correttamente l'eccezione. Ad esempio, considera questo esempio:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Ovviamente andrà male, poiché cerco di eseguire il metodo Trim() su una variabile che ha attualmente valore nullo. Se non gestisci l'eccezione, l'applicazione si bloccherà e Windows dovrà affrontare il problema. Come puoi vedere, non è molto conveniente per l'utente:
In questo caso, l'utente sarebbe costretto a chiudere l'applicazione, a causa di un errore così semplice e facilmente evitatabile. Quindi, se sai che le cose potrebbero andare storte, allora dovresti usare un blocco try-catch, come questo:
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);
}
}
Tuttavia, a volte anche il codice più semplice può generare un'eccezione e, invece di racchiudere ogni singola riga di codice con un blocco try-catch, WPF consente di gestire tutte le eccezioni non gestite a livello globale. Questo viene fatto tramite l'evento DispatcherUnhandledException nella classe Application. Se sottoscritto, WPF chiamerà il metodo di sottoscrizione una volta generata un'eccezione che non viene gestita nel proprio codice. Ecco un esempio completo, basato sulle cose che abbiamo appena visto:
<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();
}
}
}
Notate che chiamo il metodo Trim () una volta extra, al di fuori del blocco try-catch, in modo che la prima chiamata sia gestita, mentre la seconda no. Per il secondo, abbiamo bisogno della magia di 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;
}
}
}
Gestiamo l'eccezione in modo molto simile a quella locale, ma con un testo e un'immagine leggermente diversi nella finestra del messaggio. Inoltre, nota che ho impostato la proprietà e.Handled su true. Questo dice a WPF che abbiamo finito di occuparci di questa eccezione e nient'altro dovrebbe essere fatto al riguardo.
Sommario
La gestione delle eccezioni è una parte molto importante di qualsiasi applicazione e, fortunatamente, WPF e .NET rendono molto semplice gestire le eccezioni sia a livello locale che globale. Dovresti gestire le eccezioni localmente quando ha senso e utilizzare solo la gestione globale come meccanismo di fallback, poiché la gestione locale ti consente di essere più specifico e affrontare il problema in modo più specializzato.