TOC

This article is currently in the process of being translated into Ukrainian (~94% done).

A WPF application:

Handling exceptions in WPF

Якщо ви ознайомлені з С# чи будь якою іншою мовою .NET, яку можна використовувати з WPF, то обробка виключень не затруднить вас: кожного разу, коли у вас буде частина коду, яка з великою ймовірністю може видати виключення, вам потрібно буде обернути цей код в блок try-catch і акуратно обробити виключення.Звернуть увагу на наступний приклад:

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

Очевидно, що написаний код є некоректним. Я намагаюся виконати метод Trim() для змінної, яка на даний момент прийняла значення null. Якщо не обробти виключення, в вашій прогамі настане збій і Windows буде змушений розбиратися з цією проблемою. Як ви бачите, це не виглядає надто вже "user friendly":

В цьому випадку, користувач міг би прискорювати закриття програми, через таку просту помилку, яку можна дуже легко вирішити. Тому, якщо ви знаєте, що з кодом може щось трапитися, використовуйте блок try-catch наступним чином:

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

Проте, інколи навіть найпростіший код може викликати виключення і замість того , щоб обертати кожну стрічку коду в блок try-catch , можна скотистатися механізмом WPF, який дозволяє глобально обробляти виключення. Це стає можливим з використанням події DispatcherUnhandledException в класі Application. Якщо ви підписуєтеся на цю подію, WPF буде викликати меод цієї підписки кожного разу, коли буде виникати виключення, необроблене в вашому коді. Нижче наведений повний приклад , побудований на механізмі, про який ми щойно говорили:

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

Зверніть увагу, що додатково використаний метод Trim() поза блоком try-catch і виключення появилося при першому виклику, а при другому ні. Для другого нам необхідно трішки магії 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.Warning);
			e.Handled = true;
		}
	}
}

В такому випадку обробка виключень виглядає схожою як і для локальної обробки, лише з відмінністю в тому, що повідомлення про виключення містить інший текст і зображення. Також варто звернути увагу, що було визначено властивість e.Handled як true. Це проінформує WPF про те, що виключення вже оброблено і з ним не потрібне більше нічого робити.

Підсумок

Обробка виключень - це дуже важлива частина будь-якої програми, і ,на щастя , WPF та .NET роблять цей процес легким як і для локальної, так і для глобальної обробки. Потрібно обробляти виключення локально, коли це необхідно, а глобальну обробку трактуйте як резервний механізм, оскільки локальна обробка дозволяє керувати проблемою на більш високому рівні

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!