
**السلام عليكم ورحمة الله وبركاته**
تحية عطرة لكل رواد المنتدى الكرام وطاقم اشرافه الفاضل ...،

كما سبق وذكرت في الدرس السابق ، في هذا الدرس سنواصل الحديث عن الاستثناءات
لذلك من دون المزيد من المقدامات فلنباشر العمل

نواصل الحديث من حيث تركنا في اخر الدرس السابق ، اخر ماتحدثنا عنه في الدرس السابق كان هذا الكود :

وهذه نتيجته :

هنا اود التنويه بان للاستثناءات عديد "الاشكال" ان صح التعبير ، هنا نلاحظ ان الاستثناء كان من نوع System.FormatException ، وهو نوع محدد من الاستثناءات (لن اتطرق الى تعريفه بالتفاصيل فكما ترون سببه هو 'التركيبة الخطا" wrong format) لكني اردت التنويه الى هذه النقطة لانه مثل باقي كائنات اطار .NET فالاستثناءات "المحددة" ترث فئة اساسية تحت اسم Exception ,وطبعا هناك "سلم هيكلي" كبير تحت هذه الفئة ، لكنها بصفة عامة تنقسم الى قسمين كبيرين : ApplicationException و SystemException .
على سبيل المثال الاستثناء الذي قمنا برفعه في تطبيقنا FormatException يرث مباشرة من SystemException والذي بدوره يرث من Exception .
اطار .NET به عديد الاستثناءات لعديد الحالات ، نذكر منها استثناء شهير يعترض معظم المبرمجين الاوهو NullReferenceException ، وهو ناتج عن محاولة الولوج الى كائن فارغ (null) ، على سبيل المثال :

وعند محاولة التشغيل :

الان لو لاحظتم في هذا الكود :

نرى ان catch تاخذ عامل من الفئة الاساسيّة Exception ،هذا يعني اننا نريد التقاط جميع الاستثناءات بجميع انواعها ،وذلك عائد لواقع انّ جميع انواع الاستثناءات ترث من الفئة الاساسية Exception.
هذا فعال للالتقاط جميع انواع الاستثناءات ، لكن ماذا لو لم نكن ندرس ماذا يجب فعله في جميع حالات الاستثناءات ؟
يعني فرضا اننا فقط نعلم مايجب فعله في حال استثناء Format لكن لانعلم ماوجب العمل في باقي الحالات ؟
بلغة اخرى ، نريد فقك القاط استثناء Format وتمرير الباقي (اذا كان هناك احتمالية باقي طبعا) ، كل ما علينا فعله هو الاتي :

يعني كل ماعلينا فعله هو تحديد نوع الاستثناء الذي نريد التقاطه في شكل عامل ،وكما سبق وقلت اي نوع اخر من الاستثناءات لن يتم التقاطه وسيتطعل التطبيق بمجرد رفعه ، هذا مثال حيث سيتعطل تطبيقنا بعد التنفيذ :

وذلك لان الاستثناء من نوع NullReferenceException ونحن نحاول فقط التقاط استثناءات من نوع FormatException ،
وهذا ياتي مفهوم التقاط عديد الاستثناءات في وقت واحد ، فرضا اننا نريد التقاط استثناءات من نوع FormatException و NullReferenceException فقط ، كل ما علينا فعله هو الاتي :

في هذا الكود لدينا اكثر من catch ، واحد تراقب على استثناءات FormatException وتظهر Format Error في حال رفع واحدة والـ catch الاخرى تراقب على استثناءات NullReferenceException وتظهر Null Error ، وهذا بعض التجارب للتاكيد :

وعند التنفيذ :

الان في الحاله الاخرى :

عند التنفيذ :

وهنا وجب التنويه انه من غير الممكن الدخول لاكثر من catch واحدة وذلك لانه بمجرّد رفع اول استثناء سنجد انفسنا خارج كود try وداخل الـ catch المناسبة لذلك الاستثناء ثم خارج عملية التجريب بالكامل .
الان الطريقة المثاليّة لمراقبة الاستثناءات في كود معين ، هي اولا نراقب الاستثناءات المحددّة والتي لدينا في حالتها اجراءات معيّنة ، ثم نراقب الاستثناءات الاكثر عموما واخير باقي الاستثناءات ، يعني في مثالنا السابق نبدا بمراقبة FormatException و NullReferenceException والتي تمثل الاستثناءات المحددة في حالتنا ثم نراقب SystemException والتي تمثل الاكثر عموما واخيرا باقي الاستثناءات والتي تتمثل في Exception ، والكود يكون كالاتي :

طبعا وجب التاكيد على ان ترتيب الـ catch مهم للغاية ،ولو لاحظتم هنا فهذه التركيبة تشبه قليلا منطق الجمل الشرطية (if else else ..) ، وكما هو الحال مع الجمل الشرطية بامكاننا "تركيب" (imbricate) هيكل try .. catch ، هذا مثال عمّ اتحدث :

اظن ان الكود لايحتاج لاي شرح ☺
الى هنا ينتهي درسنا اليوم نلتقي في الدرس القادم حيث سنواصل حديثنا عن الاستثناءات ان شاء الله

ارجو ان الدرس كان مفيد واذا كان لكم اي استفسار فكلي اذان صاغية ،
الى اللقاء في الدرس القادم ،
مع تحياتــــــ ..،
