TOC

This article has been localized into Danish by the community.

En WPF Applikation:

Håndtering af undtagelser i WPF

Hvis du er bekendt med C# eller andre .NET sprog, du kan bruge med WPF, så burde håndtering af undtagelser ikke være nyt for dig: Når du har et stykke kode, der kan udløse en undtagelse, skal du pakke det ind i en try-catch blok for at håndtere undtagelsen. F.eks. se dette eksempel:

private void Button_Click(object sender, RoutedEventArgs e)
{
	string s = null;
	s.Trim();
}

Naturligvis vil det mislykkes, eftersom jeg prøver at udfør Trim() metoden på en variabel, som er null. Hvis du ikke håndterer den undtagelse, vil din applikation fejle, og Windows vil være nødt til at håndtere dette problem. Som du kan se, er det ikke særlig brugervenligt:

I dette tilfælde ville brugeren være tvunget til at lukke din applikation på grund af en simpel fejl, der nemt kan undgås. Så hvis du ved, at tingene kan mislykkes, bør du bruge en try-catch blok som her:

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);
	}
}

Men nogle gange kan selv den mest simple kode udløse en undtagelse, og i stedet for at pakke hver enkelt linje kode ind i try-catch blokkke, tillader WPF dig at håndtere alle ikke-håndterede undtagelse globalt. Dette gøres via DispatcherUnhandledException hændelsen på Application klassen. Hvis der abonneres på den, vil WPF kalde den abonnerende metode, når en undtagelse bliver udløst uden at blive håndteret i din egen kode. Her er et komplet eksempel baseret på det forrige eksempel:

<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();
		}
	}
}

Bemærk, at jeg kalder Trim() metoden en ekstra gang uden for try-catch blokken, så det første kald er håndteret, mens det andet ikke er. Til det andet har vi brug for magien i 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;
		}
	}
}

Vi håndterer undtagelsen meget som den lokale, men med et lidt anderledes tekst og billede i meddelsesboksen. Bemærk også, at jeg sætter e.Handled egenskaben til true. Dette fortæller WPF, at vi er færdige med at håndtere denne undtagelse og der ikke skal gøres mere ved den.

Resume

Undtagelseshåndtering er en meget vigtig del af enhver applikation, og heldigvis gør WPF og .NET det meget nemt at håndtere undtagelser både lokalt og globalt. Du bør håndtere undtagelser lokalt, når det giver mening og kun bruge den globale håndtering som en fallback mekanisme eftersom lokal håndtering giver dig mulighed for at være mere specific og håndtere problemer mere specialiseretl.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!