This article is currently in the process of being translated into Uzbek (~78% done).
Handling exceptions in WPF
Agar siz C# yoki WPF bilan ishlatishingiz mumkin bo'lgan boshqa .NET tillaridan birortasi bilan tanish bo'lsangiz, istisnolarni qayta ishlash siz uchun yangi bo'lmasligi kerak: Agar sizda istisno qilish ehtimoli bo'lgan kod bo'lagi bo'lsa, unda siz Istisnoni oqilona boshqarish uchun uni try-catch blokiga o'rang. Masalan, ushbu misolni ko'rib chiqing:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Shubhasiz, bu noto'g'ri bo'ladi, chunki men hozirda null bo'lgan o'zgaruvchida Trim() metodini amalga oshirishga harakat qilaman. Istisnoni hal qilmasangiz, ilovangiz ishdan chiqadi va Windows bu muammoni hal qilishga majbur bo'ladi. Ko'rib turganingizdek, bu foydalanuvchilar uchun juda noqulay:
![An unhandled exception, left for Windows to deal with](/Images/ArticleImages/1/chapters/wpf-application/exception_unhandled.png)
Bunday holda, foydalanuvchi bunday oddiy va osonlikcha oldini olish mumkin bo'lgan xato tufayli ilovangizni yopishga majbur bo'ladi. Shunday qilib, agar biror narsa noto'g'ri ketishini bilsangiz, try-catch blokidan foydalaning, masalan:
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);
}
}
Biroq, ba'zida hatto eng oddiy kod ham istisno qilishi mumkin va kodning har bir satrini try-catch bloki bilan o'rash o'rniga, WPF global miqyosda barcha ishlov berilmagan istisnolarni boshqarish imkonini beradi. Bu Application sinfidagi DispatcherUnhandledException hodisasi orqali amalga oshiriladi. Agar obuna bo'linsa, WPF sizning kodingizda ko'rib ishlov berilmagan istisno kelib chiqsa obuna usulini chaqiradi. Mana, biz boshdan kechirgan narsalarga asoslanib, to'liq misol:
<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();
}
}
}
E'tibor bering, men Trim() metodini try-catch blokidan tashqarida yana bir martda chaqirdim, shunda birinchi chaqiruv bajariladi, ikkinchisi esa yo'q. Ikkinchisi uchun bizga App.xaml sehri kerak:
<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;
}
}
}
![A locally handled exception](/Images/ArticleImages/1/chapters/wpf-application/exception_handled_locally.png)
![A globally handled exception](/Images/ArticleImages/1/chapters/wpf-application/exception_handled_globally.png)
We handle the exception much like the local one, but with a slightly different text and image in the message box. Also, notice that I set the e.Handled property to true. This tells WPF that we're done dealing with this exception and nothing else should be done about it.
Summary
Istisnolarni ko'rib chiqish har qanday dasturning juda muhim qismidir va xayriyatki, WPF va .NET istisnolarni lokal va global miqyosda boshqarishni juda oson qilib qo'ygan. Agar mantiqiy bo'lsa, istisnolarni lokal ko'rib chiqishingiz ma'qul va global ishlov berishdan faqat orqaga qaytish mexanizmi sifatida foydalaning, chunki lokal ishlov berish sizga aniqroq bo'lishga va muammoni yanada ixtisoslashgan tarzda hal qilishga imkon beradi.