TOC

This article has been localized into Romanian by the community.

O aplicație WPF:

Gestionarea excepțiilor în WPF

Dacă eşti familiarizat cu C# sau orice alt limbaj de programare .Net, ce poate fi folosit cu WTF, atunci gestionarea excepţiilor n-ar trebui să constituie ceva nou pentru tine. Oricând te confrunţi cu o porţiune de cod care, cel mai probabil va genera o excepţie, aceasta va trebui încadrată intr-o secţiune try-catch pentru a gestiona cu succes excepţia. De exemplu:

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

Desigur nu va funcţiona, din moment ce am încercat sa folosesc metoda Trim() pe o variabilă nulă. Dacă nu gestionezi excepţia, aplicaţia ta se va bloca, iar Windows va trebui să se confrunte cu problema. După cum se vede, soluţia nu este foarte prietenoasă:

În acest caz, utilizatorul ar fi forţat să-ţi închidă aplicaţia, din cauza unei erori atât de simple şi uşor de evitat. Deci, dacă şti că s-ar putea să nu funcţioneze cum trebuie, atunci ar trebui să foloseşti o secţiune try-catch, ca aceasta:

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

În orice caz, uneori chiar şi cel mai simplu cod poate genera o excepţie şi, în loc să încadrăm fiecare linie de cod cu o secţiune try-catch, WPF îţi permite să gestionezi global toate excepţiile netratate. Aceasta se face prin eventul DispatcherUnhandledException în interiorul clasei Aplicaţiei. Dacă această metodă va fi înscrisă în WPF, ea va fi chemată îndată ce excepţia este generată şi negestionată în codul tău. Iată un exemplu complet, bazat pe cunoştinţele acumulate până acum:

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

Observaţi că am chemat metoda Trim() încă o dată, în afara secţiunii try-catch, astfel încât prima solicitare este gestionată, în timp ce a doua, nu. Pentru cea de-a doua, vom avea nevoie de magia furnizată 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;
		}
	}
}

Gestinăm excepția asemenea uneia locale, dar cu un text diferit și o imagine diferită în fereastra de mesaje. De asemenea, observați că am setat proprietatea e.Handled ca fiind adevărată. Aceasta spune WPF-ului că am terminat să tratăm excepția și nu se mai poate face nimic în privința asta.

Concluzie

Gestionarea excepțiilor este foarte importantă și din fericire, WPF și .NET face să fie foarte ușoară tratarea excepțiilor atât în mod local cât și în mod global. Ar trebui să tratezi excepțiile local atunci când trebuie, iar global ca un mecanism de siguranță, din moment ce tratarea locală îți permite să fi mai specific si să tratezi problema într-un mod specializat.


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!