بسم الله الرحمن الرحيم
سلام شباب النهارده ساقدم لكم شرح مبسط لكيفية تتبع الاخطاء وتصحيحها
قبل ان ابد اريد ان انبه الى نقطة وهى
كتابة الكلمات الانجليزيه بالعربى وهذا انا اكرهه ولكنى كنت مضطرا الى ذلك حيث انى اكتب فى النوت باد وعلشان اكتب كلام انجليزى وسط العربى هذا يؤدى الى اختلال الكتابة.
والان لنبدأ.
يمكن ان نقسم الاخطاء حسب سبب حدوثها
1-خطا ادخال البيانات من المستخدم مثلا ان يدخل المستخدم قيمة نصية مثل"احمد" فى مربع نص المطلوب فيه ارقام
2- خطا ناتج عن عملية مثل ان يكون ناتج عملية اكبر من نطاق المتغير الذى ستخزن فيه النتيجة(مهلا ستفهم مع الامثلة).
3-هذا النوع سيتم شرحه لاحقا
النوع الاول:
اذا كان لديك كود كالتالى الذى يستقبل رقمين من مربع نص ويقوم بجمعهما واظهار الناتج فى مربع نص ثالث
int number1=System.Int32.Parse(text1.Text); int number2=System.Int32.Parse(text2.Text); int reslut=number1+number2; text3.Text=reslut.ToString();
هذا البرنامج البسط يمكنك تنفيده بمنتهى السهولة ضع ثلاث مربعات نص وزر امر وضع هذا الكود فى الحدث كليك الخاص بهذا الزر
ونفذ البرنامج اكتب اى رقمين وليكن 2و3 سيكون الناتج 5 وهذا صحيح
ادخل القيم التالية
احمد,2 ماذا سيحدث؟؟؟؟؟
ادخل القيم التالية
2,0 ماذا سيحدث؟؟؟؟؟؟؟؟؟
فى كلتا الحالتين ستظهر رسالة كالتالى
An unhandled exception of type" " occured in myprogram.Exe
معنى هذه الرسالة انه حدث شى غير متوقع تجد معلومات عنه فى الرسالة نفسها ثم تعيدك الى نافذة الكود وتوقف تنفيذ البرنامج وتدخل بك الى طور تصحيح الاخطاء حيث ستجد الجملة التى سببت الخطا مظللة باللون الاصفر.
ويجب الا يحدث هذا فى برنامجك الذى توزعه والحل مع الجملة التالية
try
{
//.........
}
catch()
{
//...........
}هذا هو الشكل العام لها حيث يوضع الكود الذى سينفذ داخل بلوك تراى كالتالى
try
{
int number1=System.Int32.Parse(text1.Text);
int number2=System.Int32.Parse(text2.Text);
int reslut=number1+number2;
text3.Text=reslut.ToString();
}
catch(System.FormatException caught)
{
//..................
}System.FormatException
تحدد هذه الجملة ماذا يحدث عندما يقابل المترجم هذا النوع من الاخطاء وهى اخطاء الفورمات مثلا متغير من النوع انتجر احاول ان اخزن داخله قيمة نصية وهكذا.
FormatException هذه احد الكلاسات المبنية داخل السى شارب والخاصة بعمليات تصحيح الاخطاء ويوجد الكثير جدا من الكلاسات الاخرى
التى تستخدم للغرض ذاته مثل
DivideByZeroException &OverflowException & InvalidOperationException & Exception.............
Systemوكلها موجودة داخل الكائن
وكما يمكنك كتابة كلاسات بنفسك واستخدامها - نتمنى مساعدة المحترفين فى هذا الشان-.
catchيمكن كتابة هذه الجملة الكثر من مرة حيث تعالج كل واخدة خطا مختلف عن الاخر
ونعود الى مثالنا اذا اردنا ان نتاكد من الا تحدث اخطاء الادخال والقسمة على الصفر كالتالى
try
{
int number1=System.Int32.Parse(text1.Text);
int number2=System.Int32.Parse(text2.Text);
int reslut=number1+number2;
text3.Text=reslut.ToString();
}
catch(System.FormatException caught //لقد عرفنا متغير من هذه الكلاس)
{
MessageBox.Show(caught.Message);
//او اكتب اى كود تريده
}
catch(System.DivideByZeroException caught)
{
MessageBox.Show(caught.Message);
}اذا حدث الخطا الاول بادخالك قيمة نصية ستظهر رسالة كالتالى
Input String Was not in a correct format
ولن يغلق البرنامج بل سيستمر فى العمل من جديد لادخال قيم جديدة
وهكذا يمكنك ان تكتب اكثر من جملة كاتش كل جملة تعالج خطا معين ويمكنك ان تكتب جملة واحدة تعالج جميع الاخطاء كالتالى
try
{
int number1=System.Int32.Parse(text1.Text);
int number2=System.Int32.Parse(text2.Text);
int reslut=number1+number2;
text3.Text=reslut.ToString();
}
catch(System.Exception caught )
{
MessageBox.Show(caught.Message);
}النوع الثانى هو الاخطاء التى تنتج عن العمليات داخل البرنامج خذ هذا المثال مرة اخرى
int number1=System.Int32.Parse(text1.Text); int number2=System.Int32.Parse(text2.Text); int reslut=number1+number2; text3.Text=reslut.ToString();
نفذ البرنامج وادخل القيم التالية مثلا 9876543 و 9876543
وانظر ما التيجة لا يمكن ان تكون صحية وغالبا تكون رقم سالب وهذا غير ممكن مجموع رقمين موجبين رقم سالب ماذا حدث
الذى حدث ان مجموع الرقمين الكبر من نطاق الانتجر ولذلك لم يتمكن البرنامج من تخزين هذه القيمة فى متغير من هذا النوع
فما الحل ؟؟؟ الحل هو ان اتاكد من ان الرقو الناتج ليس اكبر من نطاق المتغير الذى سيخزن فيه؟؟؟ كيف
Checkedذلك باستخدام .
ونر ذلك فى المثال التالى
int number1=System.Int32.Parse(text1.Text); int number2=System.Int32.Parse(text2.Text); int reslut=checked(number1+number2); text3.Text=reslut.ToString();
نفذ البرنامج وادخل نفس الارقام السابقة ماذا ترى **رسالة الخطا التى سبق ان راناها قبل ذلك ** ومن ثم تعود الى نافذة الكود.
اذن الان يمكننا ان نعالج هذا الخطا باستحدام جملة ايهههههه
catchفعلا هى .
اذن نحن نستخدم كلمة شكيد لثير الخطا فنتمكن من معالجته باستخدام كاتش والتى نستخدمها تماما مثل ما كنا نستخدمها مع تراى
تعالو نطبق على هذا المثال
int number1=System.Int32.Parse(text1.Text);
int number2=System.Int32.Parse(text2.Text);
int reslut=checked(number1+number2);
text3.Text=reslut.ToString();
catch(System.OverflowException caught)
{
MessageBox.Show(caught.Message);
}checkedيمكن ان تكتب هذه الجملة كما كتبت سابقا او كبلوك ولا تشتخدم الا مع الانتجر فقط
النوع الثالث
تخيل ان لدينا برنامج بسيط يحتوى على مربعين نص وزر امر يقوم المستخدم بكتابة رقم الشهر فى المربع الاول ويضغط الزر فيظهر اسم الشهر فى المربع الثانى فمثلا لو كتبنا فى المربع الاول 1 ثم نضغط الزر فيظهر يناير فى المربع الثانى
كيف يعمل هذا البرنامج؟؟؟؟؟؟؟؟؟؟؟؟؟؟
ياحذ هذا البرنامج القيمة من مربع النص الاول ويختبر هذه القيمة كالتالى
int month=Int32.Parse(text1.text);
switch (month)
{
case 1:
MessageBox.show("the month is Jan");
case 2:
MessageBox.show("the month is Feb");
..
..
case 12:
MessageBox.show("the month is Dec");
}ضع هذا الكود فى الحدث كليك للزر -بعد اكماله طبعا - واكتب اى رقم من 1 الى 12 ستظهر رسالة تخبرك باشم الشهر
لكن ماذا لو ادخلت 15؟؟؟؟؟؟؟؟؟؟
throwيمكنك استخدام هذا التعبير لعلاج مثل هذه المشكلة .
نر ذلك بالمثال التالى
int month=Int32.Parse(text1.text);
switch (month)
{
case 1:
MessageBox.show("the month is Jan");
case 2:
MessageBox.show("the month is Feb");
..
..
case 12:
MessageBox.show("the month is Dec");
defalut :
throw new System.ArgumentOutOfRangeException("Bad month");
}لاحظ اننا حددنا نوع الخطا بانفسنا وهو المكتوب باللون الاحمر
نفذ البرنامج وادخل القيمة 15 فى المربع الاول واضغط على الزر ماذا ترى؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟
نفس الرسالة التى سبق ان رايناها تحمل الرسالة التى حددناها ايضا وهى المكتوبة باللون الفوشيا
الان نستطيع ان نعالج هذا الخطا باستخدام ايه؟؟ خمن
catchنعم فعلا اها جملة .
فيكون المثال كالتالى
int month=Int32.Parse(text1.text);
switch (month)
{
case 1:
MessageBox.show("the month is Jan");
case 2:
MessageBox.show("the month is Feb");
..
..
case 12:
MessageBox.show("the month is Dec");
defalut :
throw new System.ArgumentOutOfRangeException("Bad month");
}
catch( System.ArgumentOutOfRangeException caught)
{
MessageBox.Show(caught.message);
}خذ مثالا اخر
افترض المثال الاول الذى كنا نستخدمه لجمع رقمين تخيل اننا نريد ان نجرى عمليات الضرب والقسمة والطرح على الرقمين المدخلين
فانننا سنضيف 4 مربعات اختيار ونعطيها اسماء مناسبة
ونكتي الكود الخاص بها فى دوال - اعتقد ان هذا ليس صعبا - لننادى هذه الدوال عند الضغظ على الزر
ويكون الكود داخل حدث الكليك الخاص بهذا الزر كالتالى
if(addoption.checked) addvalue(number1,number2); else if(suboption.checked) subvalue(number1,number2); else if(divoption.checked) divvalue(number1,number2); else if(muloption.checked) mulvalue(number1,number2);
بفرض انك اعددت الدوال
addvalue,subvalue,mulvalue,divvalue
وغيرت اسماء مربعات الاختيار الى
addoption,suboption,miuloption,divoption
نفذ البرنامج وحدد اى مربع اختيار واكتب اى رقمين واضغط الزر سينفذ العملية المطلوبة
اعذ تنفيذ البرنامج واكتب رقمين ثم اضغط الزر دون تحديد ماذا سيحدث؟؟؟؟؟؟؟؟؟
من اممكن ان تضيف جملة اخرى الى الكود كالتالى
else
MessageBox.show("no operator selected");قد تحل المشكلة هكذا ولكنها ليست فكرة جيدة على اية حال ولكن الافضل ان تستخدم الطريقة الاخرى كاتالى
else
throw new InvalidOperationException("no operator selected");catchثم نستخدم جملة .
واخيرا
خلال الامثلة السابقة عند حدوث خطا فا البرنامج يخرج ولا يكمل تنفيذ الجمل التالية وهذا قد يسبب مشكلة فى احيان كثيرة
مثـــــــلا:
كود يقوم بفتح ملف معين للقراءة ويغلقه بعد اتمام القراءة
ماذا لو حدث خطا اثناء القراءة فان للبرنامج لن يكمل وبالتالى لن يغلق الملف فما هو الحل؟؟؟؟؟؟؟؟؟
finallyالحل باستخدام .
خذ المثال التالى
TextReader reader=null;
try
{
reader= src.OpenText();
string line;
while((line=reader.ReadLine()) != null)
{
source.text += line +"n";
}
}
finally
{
if(reader != null);
reader.Close;
}انتهى هذا الدرش على خير نصيحتى لك التطبيق السريع
ولو اى شى مش واضح لا تتردد فى الرد
prince of egypt

