This article is currently in the process of being translated into Arabic (~95% done).
معالجة الاستثنائات في WPF
إذا كنت من مستخدمي لغة سي شارب C# او بيئة الدوت نت .Net كال WPF فلن يكون موضوع معالجة الأخطاء جديدا بالنسبة لك : حيث يكون لديك جزأ من الكود يمرر خطأ ما , ومن ثم تقوم بتحزيم هذا الكود بالعبارة الشهيرة try/catch لالتقاط ذاك الخطأ ومعالجته بدقة خذ المثال التالي كنموذج
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
بوضوح سيتسبب هذا بخطأ, كوني أحاول استخدام دالة التقليم ()Trim على متغير فارغ (null) , إذا لم تعالج هذا الإثتثناء فإن التطبيق سيتحطم ويتوقف على الفور وسيتعامل نظام التشغيل مباشرة مع هذه المشكلة. كما ترى هذا فهذا ليس سهل الاستخدام على الإطلاق
في هذه الحالة سيكون المستخدم مجبرا على غلق تطبيقك , بسبب خطأ بسيط كهذا . لهذا : إذا كنت تعلم ان ثمة خطأ سيحدث عليك بإستخدام المجموعة 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);
}
}
بالرغم من ذلك , أحيانا حتى أبسط الأكواد من الممكن ان تسبب أخطاء إثتثنائية (Exceptions) لذا فعوضا عن تحزيم كل سطر بمجموعة try/catch ف WPF يسمح لك بالتقاط جميع الأخطاء عموميا في المشروع . وهذا يتم عن طريق الحدث DispatcherUnhandledException في كلاس التطبيق (Application Class) . إذا تم التنصت عليه (Subscription) ف 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;
}
}
}
لقد عالجنا الخطأ كالمعالجة المحلية -في الكود وليس في ملف App.xaml- لكن مع نص مختلف قليلا وصورة في مربع الرسالة (Message Box) . أيضا لاحظ انني وضعت الخاصية e.Handled=true وهذا سيخبر ال WPF اننا تعاملنا مع هذا الخطأ ولا داعي لوضع اي اعتبار له
الملخص
معالجة الاخطاء هام جدا كجزأ أساسي من أي تطبيق ولحسن الحظ ف WPF & .Net جعلت هذا الامر سهل جدا على المستوى المحلي في الكود والعام للمشروع ككل . لذا : فعليك معالجة الأخطاء محليا عندما يبدوا لك ان هناك خطأ قد يحدث , وجعل المعالجة العامة مجرد ءالية مراجعة للمشروع حيث ان المعالجة المحلية للأخطاء تسمح بتخصيص التعامل مع الخطأ بطريقة جيدة ومخصصة جدا ومناسبة للغرض