This article has been localized into Ukrainian by the community.
Обробка винятків у 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.Error);
e.Handled = true;
}
}
}
В такому випадку обробка виключень виглядає схожою як і для локальної обробки, лише з відмінністю в тому, що повідомлення про виключення містить інший текст і зображення. Також варто звернути увагу, що було визначено властивість e.Handled як true. Це проінформує WPF про те, що виключення вже оброблено і з ним не потрібне більше нічого робити.
Підсумок
Обробка виключень - це дуже важлива частина будь-якої програми, і ,на щастя , WPF та .NET роблять цей процес легким як і для локальної, так і для глобальної обробки. Потрібно обробляти виключення локально, коли це необхідно, а глобальну обробку трактуйте як резервний механізм, оскільки локальна обробка дозволяє керувати проблемою на більш високому рівні