رد جديد  مشاركة جديدة 
السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C# (السيطرة على الأخطاء Exception Handling)
الكاتب الرسالة
صور سيارات رووووووعه
الحريف
عضو مسجل خطر


المشاركات : 267
مجموعة : مسجل خطر
الإنتساب : Sep 2007
الحالة : غير متصل
السمعة : 0
الرد : #1
السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C#

السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C#
السيطرة على الأخطاء Exception Handling

<!-------------------><!--مقطع البدايه----->

<!--------------------><!--الخبر الرئيسي----->


موضوع درسنا اليوم هو Exception Handling ولكن قبل أن نشرح ما هو الـException Handling دعونا نتحدث عن أنواع الأخطاء التي قد تواجه المبرمج أثناء البرمجة.. ما رأيكم بالقيام بمثال عملي؟!

قوموا بفتح برنامج وكتابة الأسطر التالية فيه:

int result = 90/ 0;
MessageBox.Show(result.ToString());
[LEFT ALIGN=CENTER] [/LEFT ALIGN]


برنامج بسيط يمثل قسمة عددين.. يبدو أن الأسطر خالية من أي خطأ، دعونا الآن نقوم بترجمة
compile البرنامج لنتأكد من ذلك... بعد ترجمته نجد أنه أظهر لنا خطأ هو: "Division by constant zero"

كيف تعرّف الكومبايلر على هذا الخطأ واكتشفه بالرغم من أن البرنامج تراءى لنا في البداية بدون أخطاء؟!
عرف الكمبايلر هذا الخطأ لأنه خطأ ظهر له أثناء عملية الـcompilation وهذه الأنواع من الأخطاء تسمى Compile Time error... لكن ماذا لو جعلنا "المقسوم عليه" عبارة عن متغير يتم إدخاله
مثلاً
من قبل المستخدم أثناء وقت تنفيذ البرنامج Run Time، هل سيكتشف البرنامج إذا أدخل المستخدم قيمة "صفر" لكي يعطي نفس الخطأ الذي أظهره لنا وقت الـcompilation، أم لا؟ وهل سيعتبره خطأ أم لا؟!

في الواقع هذا النوع من الأخطاء يسمى Run Time error ويمكننا التعامل معه باستخدام
Exception Handl
er وهذا ما سنتعرف عليه خلال الأسطر القليلة القادمة


·

ماهو


الـ
Exception في لغات البرمجة:



كما هو واضح من معنى هذا المصطلح فهو استثناء عن قاعدة
معينة .

و
هي
دلالة على وقوع مشكلة ما أثناء تنفيذ البرنامج مما يتسبب في توقف البرنامج وعدم قدرته على متابعة التنفيذ.

  • ما هو
    الـ
    Exception Handling :

    هو قدرة المبرمج على حل مثل هذه المشاكل التي تحدث أثناء تنفيذ البرنامج, وحصر هذه
    الـ
    Exceptions التي يمكن وقوعها في البرنامج, بحيث يتم تفاديها لكي لا تعيق عمل البرنامج ولا تسبب توقفه عن التنفيذ, وذلك بواسطة
    ميكانيزم
    معين سنتعرف عليه بعد قليل.

    أمثلة على بعض
    الـ
    Exceptions الشائعة:

    • القسمة على صفر "division by zero".
    • نتيجة عملية حسابية ضخمة "arithmetic overflow".
    • إرسال قيم خاطئة للدوال أو غير مناسبة "invalid method parameters".وغيرها الكثير والكثير .
      ولكي يتسع لديك مفهوم
      الـ
      Exception دعنا نأخذ مثالا على ذلك:

      فمثلا: لو قمنا بكتابة برنامج بسيط لقسمة عددين
      كالتالي
      , و كتب المستخدم في خانة المقسوم عليه القيمة صفر:



      [CENTER ALIGN=CENTER][/CENTER ALIGN]


      عندما نطلب النتيجة,
      ستظهر
      رسالة خطأ كما في الشكل التالي:




      فالذي حدث الآن هو
      Exception ,
      لأن عملية القسمة على صفر عملية غير مقبولة!, وكما هو واضح من رسالة الخطأ أعلاه فإن نوع
      الـ
      Exception هنا هو ,
      DivideByZeroException
      وبعد ظهور الرسالة سيتوقف البرنامج عن التنفيذ وطبعا توقف البرنامج بهذا الشكل أمر غير مستحسن.!

      ولن تستطيع
      إجبار
      المستخدم على عدم كتابة الصفر في خانة المقسوم عليه!!!! ..

      مثال آخر على
      الـ
      Exception
      على نفس البرنامج السابق, ولنفرض أن المستخدم أدخل في أحد الخانتين نص وليس رقم فلن تتم العملية وستظهر رسالة الخطأ التالية ولن يتابع البرنامج تنفيذ عمله .




      ونوع
      الــ
      Exception
      الذي حدث الآن هنا هو

      FormatException

      والذي ينتج عادة نتيجة إدخال قيمة غير صالحة.

      و
      لذلك
      أولا كل ما على المبرمج التفكير
      به
      هو توقع مثل هذه الأخطاء "
      Exceptions
      " التي قد تحدث أثناء تنفيذ برنامجه لكي يقوم بعمل
      handling لها, ولكن كيف؟

      وهو بواسطة
      الـ
      try, catch, and finally blocks " " والتي محور درسنا اليوم.



      try
      { }

      catch
      { }

      finally
      { }

      و التي يشترط لها الترتيب
      السابق .
      ...


      نكتب بداخل هذا
      الــ
      block كل ما نتوقع حدوث
      الـ
      Exception فيه ..أي أمر تتوقع حدوث Exception
      فيه فقم بوضعه هنا ...

      [LEFT ALIGN=RIGHT]Try block { }[/LEFT ALIGN]
      الأوامر الموجودة في هذا
      الــ
      block يتم تنفيذها فقط في حالة حدوث
      ال
      Exception وهي تقوم بمعالجة
      الـ
      Exception
      التي تنتج أثناء تنفيذ البرنامج أو بمعنى إمساكها و السيطرة عليها حتى لا تعيق عمل البرنامج ..
      [LEFT ALIGN=RIGHT]Catch block{ }[/LEFT ALIGN]
      الأوامر التي نضعها بداخل هذا
      block يتم
      تنفيذها في جميع الحالات سواء حدث Exception في البرنامج أو لو لم يحدث ..
      [LEFT ALIGN=RIGHT]Finally block { }[/LEFT ALIGN]

      بالنسبة
      للـ catch block
      فإني أود توضيح نقطة وهي أنه يمكننا كتابتها بأحد طريقتين :

      ü
      الأولى
      كالتالي:


      [CENTER ALIGN=CENTER]
      catch
      [/CENTER ALIGN]
      [CENTER ALIGN=CENTER]{[/CENTER ALIGN]
      [CENTER ALIGN=CENTER]}[/CENTER ALIGN]

      وهنا لا تختص بنوع معين من
      الــ
      Exception أي أنها تقوم باقتناص أي Exception
      قد يحدث في البرنامج وسنستخدم هذه الطريقة إذا لم نكن نعرف
      الـ

      Exception بالتحديد .



      ü
      الثانية
      كالتالي:


      [CENTER ALIGN=CENTER]
      catch
      ( )
      [/CENTER ALIGN]
      [CENTER ALIGN=CENTER]{[/CENTER ALIGN]
      [CENTER ALIGN=CENTER]}[/CENTER ALIGN]

      حيث أننا نكتب بين القوسين نوع
      الـ
      Exception الذي قد يحدث بالتحديد .



      يمكنك في البرنامج استخدامها catch block أكثر من مرة واحدة كما سنرى في المثال لاحقا ...





      finally

      block هي اختيارية و لا يشترط كتابتها دائما ..



      و لكي تتضح الأمور لديك أكثر فإننا سوف نطبق ذلك على مثال عملي " برنامج قسمة عددين ", و سنقوم بعمل handling لنوعين من أنواع
      الـ
      Exception التي قد تحدث في البرنامج والتي تعرضنا لها في بداية الدرس, وهي:

      1.

      FormatException

      و 2.


      DivideByZeroException

      و
      قد تعرفنا على سبب حدوث كل منهما ...


      باعتبار
      أنك قمت بتصميم Form
      مشابه للتالي:




      عند حدث النقر على
      الـ
      Button
      "
      Divide
      " الموجود أعلاه, سنكتب الأوامر التالية في حدث
      button1_Click:


      private
      void button1_Click(object sender,
      System.EventArgs
      e)
      {

      try
      {


      int


      firstNum
      =Convert.ToInt16(this.textBox1.Text);


      int


      secondNum
      =Convert.ToInt16(this.textBox2.Text);


      int

      result=
      firstNum/secondNum
      ;
      this.label2.Text=

      result.ToString

      (
      );
      }
      // process invalid number format

      catch(
      FormatException
      )

      {
      MessageBox.Show

      ("Invalid input value, input values must be
      integer","error
      .."); }
      // division generates
      DivideByZeroException
      if the
      secondNum
      is zero

      catch(
      DivideByZeroException
      ex2)

      {
      MessageBox.Show

      (ex2.Message.ToString(),"error.."); }
      }


      ومخرجات البرنامج
      المتوقعة
      ستكون مشابهة لما يلي:




      و
      قبل
      أن أتحدث عن تفاصيل البرنامج, دعونا نلقي نظرة على المخرجات لهذا البرنامج:

      1- فأول نافذة تمت فيها عملية القسمة بنجاح.
      2- و النافذة التالية توضح نتيجة إدخال المستخدم للقيمة
      "
      hello


      "
      في ثاني

      textBox
      فهنا عندما ينقر المستخدم على Divide
      , فلن يستطيع البرنامج من تحويل هذه القيمة المدخلة إلى النوع
      integer بواسطة الدالة Convert.ToInt16, و معروف أن وظيفة هذه الدالة
      Convert.ToInt16(
      )
      هو تحويل القيمة الموجودة بين القوسين إلى النوع
      integer , فإذا لم تستطع الدالة من التحويل كما في هذه الحالة فستنتج لنا (
      FormatException
      ) و ستظهر رسالة الخطأ للمستخدم ولن تتم طبعا عملية القسمة.

      3-والنافذة التالية توضح نتيجة إدخال المستخدم للقيمة "0" في ثاني

      textBox


      ,

      وبما أن عملية القسمة على صفر عملية غير مقبولة إذن سينتج لنا (
      DivideByZeroException
      ) وستظهر رسالة الخطأ الموضحة في الشكل.


      و الآن
      لنناقش
      الأوامر المكتوبة في حدث النقر للزر "
      Divide", خطوة
      خطوة
      :


      في البداية المستخدم يقوم بإدخال القيم في مربعي النص, ثم ينقر
      على "
      Divide ", ليتم تنفيذ أوامر حدث النقر كالتالي:

      أولا قمنا بتعريف try block وكما قلنا بأنه سيحتوي على الجزء من البرنامج الذي يمكن أن ينتج منه "Exception" وهذا الجزء في برنامجنا هو عملية القسمة لذلك وضعناها داخل
      الـ
      try block .

      بداخل هذا
      الـ
      block عرفنا متغيرين
      firstNum
      و
      secondNum

      من النوع
      integer والتي تستقبل القيم المدخلة من المستخدم, و نلاحظ استخدامنا للدالة

      Convert.ToInt16 لتحويل القيم إلى
      النوع
      ,integer

      بعدها سنقوم بعملية القسمة
      ..



      int

      result=
      firstNum/secondNum
      ;



      وتخزين الناتج في المتغير result
      من النوع
      integer
      أيضا , ثم بعد ذلك إخراج النتيجة على
      label2
      ...

      بعد ذلك عرّفنا two catch blocks واستخدمنا أحدها مع الـ FormatException, والأخرى مع الــ DivideByZeroException ..
      فإذا أدخل المستخدم قيمة غير صالحة مثل النص ولم تستطع الدالة Convert.ToInt16
      من تحويله إلى

      integer ,
      عندها ستقوم هذه الدالة بتوليد

      FormatException
      , بعدها سيقوم البرنامج بعمل مقارنة بين هذا
      الـ
      Exception الناتج, وبين نوع
      الـ
      Exception الموجود بين قوسي
      الـ
      catch, فعندما يرى أنها متساوية سيقوم بتنفيذ الأسطر التي بداخل هذا
      الـ
      catch block, كالتالي:


      catch(

      FormatException
      )

      {
      MessageBox.Show

      ("Invalid input value, input values must be
      integer","error
      .."); }


      والتي ستقوم بإظهار رسالة الخطأ "Invalid input value, input values must be integer"
      للمستخدم
      .


      وإذا أدخل القيمة صفر في الخانة الثانية, فلن تتم عملية القسمة, و ستنتج
      الـ

      DivideByZeroException
      والتي سنعمل لها handling
      بواسطة
      الـ

      catch block التالية :


      catch(

      DivideByZeroException
      ex2)

      {
      MessageBox.Show

      (ex2.Message.ToString(),"error.."); }


      وهنا نلاحظ فرق بسيط عن
      الـ
      catch السابقة لهذه, وهي أننا هنا قمنا بتعريف الكائنex2 من
      الـ
      class
      DivideByZeroException
      , بحيث أن رسالة الخطأ هنا لم نكتبها نحن بل استخدمنا الخاصية Message
      مع الكائن
      ex2 لإظهار الرسالة التي سوف يصدرها النظام عن هذا الخطأ.


      طبعا إذا تم تنفيذ الأسطر الموجودة داخل try دون حدوث أي Exception فسيتم إخراج النتيجة فورا, وسيتجاهل البرنامج
      الـ
      two catch blocks .

      و
      بذلك
      يستطيع المبرمج تفادي الأخطاء التي قد تحدث أثناء تنفيذ البرنامج...



      وبذلك أيضاً يكون المبرمج مسيطر على أي نوع من الأخطاء من الممكن أن تظهر له أثناء برمجته سواء كانت
      Compile Time error حيث سيكتشفه الكومبايلر، أو كانت Run Time error حيث سيسيطر عليه بالـException handler.... يبقى له فقط تفادي الخطأ المنطقي في البرنامج -أي استخدام منطق غير صحيح في البرمجة- لكي يكتب برامج بلا أخطاء...وحتى الخطأ المنطقي Logical error يمكنك السيطرة عليه في بيئة الدوت نت وذلك باستخدام الـbreak point،
      تذكر أن أنواع الأخطاء في البرمجة ثلاثة Compile Time error, Run Time error, and Logical error وأنك بقراءة هذا السطر تكون سيطرت عليها جميعها في برنامجك


      أخيراً
      , أتمنى أن أكون وُفّقت في عرض الفكرة




السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C#

09-14-2007 10:37 PM
أرسل بريد للمستخدم إعرض جميع مشاركات العضو إقتبس الرسالة فى رد

عالم السيارات العاب سيارات

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


المشاركات : 267
مجموعة : مسجل خطر
الإنتساب : Sep 2007
الحالة : غير متصل
السمعة : 0
الرد : #2
RE: السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C#

منقوول

09-14-2007 10:37 PM
أرسل بريد للمستخدم إعرض جميع مشاركات العضو إقتبس الرسالة فى رد
رد جديد  مشاركة جديدة 
السيطرة على الأخطاء Exception Handling - دروس سى شارب C# - دروس السى شارب C#

إحتمالات التقييم ...
المشاركة : الكاتب الردود : المشاهدات : آخر رد
  الرجااااااااء المساعدة وبسرعة musabxbs 1 320 03-06-2008 11:27 PM
آخر رد: عاشقة السعاده
  Regular Expression --2 - دروس سى شارب C# - دروس السى شارب C# الحريف 1 676 09-14-2007 10:52 PM
آخر رد: الحريف
  Regular Expression --1 - دروس سى شارب C# - دروس السى شارب C# الحريف 1 702 09-14-2007 10:49 PM
آخر رد: الحريف
  مدخل إلى البرمجة غرضيّة التوجّه في السي شارب - دروس سى شارب C# - دروس السى شارب C# الحريف 1 745 09-14-2007 10:47 PM
آخر رد: الحريف
  ربط الفلاش بال #C - دروس سى شارب C# - دروس السى شارب C# الحريف 1 621 09-14-2007 10:45 PM
آخر رد: الحريف
  الدوال --2--#Methods in c - دروس سى شارب C# - دروس السى شارب C# الحريف 1 484 09-14-2007 10:43 PM
آخر رد: الحريف
  الدوال --1--#Methods in c - دروس سى شارب C# - دروس السى شارب C# الحريف 1 696 09-14-2007 10:40 PM
آخر رد: الحريف
  المؤشرات في سي شارب - دروس سى شارب C# - دروس السى شارب C# الحريف 1 717 09-14-2007 10:35 PM
آخر رد: الحريف
  التحويل العلني - Explicit Conversion - دروس سى شارب C# - دروس السى شارب C# الحريف 1 465 09-14-2007 10:33 PM
آخر رد: الحريف
  تحويل الأنواع - التحويل الضمني - دروس سى شارب C# - دروس السى شارب C# الحريف 0 423 09-14-2007 10:28 PM
آخر رد: الحريف
  المتغيرات - Variables - دروس سى شارب C# - دروس السى شارب C# الحريف 2 599 09-14-2007 10:27 PM
آخر رد: الحريف
  أنواع البيانات – Data Types - دروس سى شارب C# - دروس السى شارب C# الحريف 1 392 09-14-2007 10:24 PM
آخر رد: الحريف
  البرنامج الأول في C# - دروس سى شارب C# - دروس السى شارب C# الحريف 1 420 09-14-2007 10:23 PM
آخر رد: الحريف
  البرنامج الأول في C# - دروس سى شارب C# - دروس السى شارب C# الحريف 0 551 09-14-2007 10:22 PM
آخر رد: الحريف
  نقاط مهمة في C# - دروس سى شارب C# - دروس السى شارب C# الحريف 0 871 09-14-2007 10:20 PM
آخر رد: الحريف

مشاهدة نسخة للطباعة
إرسال المشاركة لصديق
إشترك بالمشاركة | إضافة المشاركة للمفضلة

الذهاب إلى :

 Quick Theme: