This article is currently in the process of being translated into Persian (~99% done).
Handling exceptions in WPF
اگر با زبان #C یا یکی دیگر از زبانهای NET. که در WPF استفاده میشود آشنا هستید، اداره کردن exception نباید برای شما چیز جدیدی باشد: هر زمان که شما یک قطعه کد دارید که احتمال دارد برای شما exception ایجاد کند، باید آن را در یک بلوک try-catch قرار دهید تا قابل اداره کردن باشد. به عنوان نمونه، این مثال را در نظر بگیرید:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
اشتباه بودن این کد بدیهی است، زیرا من سعی می کنم متد ()Trim را روی متغیری که در حال حاضر تهی است فراخوانی کنم. اگر شما از این exception را اداره نکنید، موجب بروز مشکل در برنامه میشود و ویندوز مجبور است این مشکل را تحمل کند. همانطور که میبینید، این موضوع به هیچ وجه کاربر پسند نیست:
در این حالت، به دلیل چنین خطای سادهای که به راحتی قابل اجتناب است، کاربر مجبور میشود برنامه شما را ببندد. بنابراین، اگر احتمال میدهید مواردی به اشتباه پیش روند، باید از بلوک 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);
}
}
در عین حال، گاهی اوقات حتی سادهترین کد ممکن است یک exception ایجاد کند، به جای قرار دادن تک تک قسمتهای کد، درون بلوکهای try-catch، این امکان در WPF وجود دارد تا همه exceptionهای مدیریت نشده را در سطح کلان اداره کنید. این کار از طریق رویداد DispatcherUnhandledException در کلاس Application انجام میشود. در صورت استفاده از این رویداد، هنگامی که یک exception ایجاد شود که در کد مربوط به خود اداره نشده باشد، 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. اداره خطا در هر دو سطح محلی و کلان را بسیار آسان میکند. شما باید در تمامی موارد ممکن و منطقی، خطاها را به صورت محلی کنترل کنید و از اداره کردن خطا در سطح کلان به عنوان مکانیسم برگشت پذیر استفاده کنید، زیرا رسیدگی محلی به شما این امکان را میدهد تا به شکل تخصصیتری علت خطا را برطرف کنید.