الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

تصحيح الاخطاء فىسى شارب

مغلق
بدأه prince of egypt في 24 نوفمبر 2002 · 8 رد · 2,991 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم

سلام شباب النهارده ساقدم لكم شرح مبسط لكيفية تتبع الاخطاء وتصحيحها

قبل ان ابد اريد ان انبه الى نقطة وهى

كتابة الكلمات الانجليزيه بالعربى وهذا انا اكرهه ولكنى كنت مضطرا الى ذلك حيث انى اكتب فى النوت باد وعلشان اكتب كلام انجليزى وسط العربى هذا يؤدى الى اختلال الكتابة.

والان لنبدأ.

يمكن ان نقسم الاخطاء حسب سبب حدوثها

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

#2

أشكرك أخي حقيقة على هذا الدرس ..

وأذكر انني تحدثت عن الأخطاء وطريقة التعامل معها (Exception Handling) لكن كان ذلك في منتدى الـ ASP ولكن للاسف :( رحل ذلك الشرح مع المنتدى ..

أشكرك اخي مرة اخرى وتقبل تحياتي (f) (f)

ملاحظة أخي :

لماذا لا تستخدم الاوسمة المخصصة لكتابة الكود ..

[ code ], [ /code] ..

مثال:

Console.WriteLine("Hello World !");
#3

شكرا اخى ابو فهد على هذا الثناء

بالنسبة للوسوم انا كنت مجهز الموضوع ودخلته على طول وان يا اخى لم ارى الشرح الذى وضعته

ولو رايته لما وضعت هذا الشرح المتواضع جدا

على كل اهى حاجة تحرك المنتدى

اخى لى عندك سؤال

انا استخدم الاداه rich edit control فى احد البرامج اريد ان اغير لون كلمة معينة محددة بمجرد كتابتخا على ان يتم هذا تلقائيا دون تدخل الشخص الذى يكتب

فكيف هذااااااااااا

وشكررررررررررررررررا جزيلا لاهتمامك

#4

يعني انت تريد ان تحدد نص معين ... استخدم الدالة Select ..

richTextBox.Select(int Start, int Length);

وعندما تريد استخدامها ..

richTextBox.Select(3, 20);

راح يحدد لك النص بداية الحرف الثالث وبطول 20 حرف !..

وشكرا لك مرة اخرى ..

#5

شكرا اخى وكل عام وانتم بخير

#6

مشكور على أخي

بس يوجد سؤال

اقتباس
TextReader reader=null;

try

{

reader= src.OpenText();

string line;

while((line=reader.ReadLine()) != null)

  {

    source.text += line +"n";

  }

}

finally

{

    if(reader != null);

        reader.Close;

}

ما الفرق بينه و بين هذا كود

اقتباس
TextReader reader=null;

try

{

reader= src.OpenText();

string line;

while((line=reader.ReadLine()) != null)

  {

    source.text += line +"n";

  }

}

    if(reader != null);

        reader.Close;

أرجوا مساعدة

تم تعديل هذه المشاركة بواسطة yadoo86 في 21 أغسطس 2005 في 16:13

winter-main.jpg

6179.gif

#7

لماذا لم تفتح موضوعاً جديدا بدلاً من هذا الذي تعدى الثلاث سنوات

Sr. Software Development Engineer
Hulu, LLC
My Blogs

#8

مشكور أخي bashmohandes على ردك و لكن لا أريد من مواضيع مكرره أن تنعاد !

أرجوا أن تفهم قصدي

winter-main.jpg

6179.gif

#9
public static void test(){
TextReader reader=null;

try{
//سنفتح الملف!!
reader= src.OpenText();
//تصور أن خطأ حدث هنا...
//سنخرج من هذا الطريقة أو Method test();
//من غير أن تغلق الملف!
//لكن الحمد الله أننا وضعنا finally 
//لنغلق الملف قبل مغادرة الطريقة!!
string line;

while((line=reader.ReadLine()) != null){ 

    source.text += line +"n";

  }

}
finally{

    if(reader != null)

        reader.Close;
Console.Write("the File will be Closed even if an exception occured!!");
}
}

ما الفرق بينه و بين هذا كود

public static void test(){
TextReader reader=null;

try{

reader= src.OpenText();

string line;

while((line=reader.ReadLine()) != null) { 
//لو حدث خطأ هنا، سنخرج من غير إغلاق الملف
    source.text += line +"n";

  }

}



    if(reader != null)
        reader.Close;
Console.Write("File Closed");
}

هذا الموضوع مغلق.

مواضيع مشابهة