إدارة الاستثناءات في C#
إدارة الاستثناءات في c#
قد تحتوي البرامج التي نكتبها أحيانًا على مشاكل وأخطاء.
بالطبع ، في لغة c# ، نستخدم مترجمًا قويًا جدًا ويساعدنا في العثور على هذه الأخطاء.
ومع ذلك ، من الواضح أنه بغض النظر عن مدى قوة المترجم ، فإنه لا يمكنه التنبؤ بجميع الأخطاء.
في هذه الحالة ، يقوم .NET framework بإنشاء استثناء ، في الواقع ، يخبرنا هذا الاستثناء أن هناك مشكلة في البرنامج.
دعنا نلقي نظرة على المصفوفة. ضع في اعتبارك الكود التالي:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | using System; using System.Collections; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { int[] numbers = new int[2]; numbers[0] = 23; numbers[1] = 32; numbers[2] = 42; foreach(int i in numbers) Console.WriteLine(i); Console.ReadLine(); } } } |
إذا قمت بتشغيل المثال أعلاه ، فستعرف ما أتحدث عنه.
هل تواجه مشاكل أثناء الجري؟ في المثال أعلاه ، قمنا بتعريف مصفوفة من الأعداد الصحيحة ذات السعة المزدوجة.
لكننا نحاول أن نضع قيمة في المنزل الثالث من هذه المجموعة وهو غير موجود.
من الواضح أن هذا سيؤدي إلى خطأ في وقت التشغيل.
بالطبع ، عند استخدام بيئة Visual Studio لتشغيل هذا الرمز ، يتم تزويدنا بخيارات متنوعة لعرض سبب الخطأ.
ولكن إذا حاولت تشغيل البرنامج بدون هذه البيئة وبالضغط على ملف EXE ، فسوف تواجه خطأ غير سارة.
لحسن الحظ ، يمكن إدارة هذه الأخطاء. أدناه يمكنك مشاهدة الإصدارات المعدلة من المثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | int[] numbers = new int[2]; try { numbers[0] = 23; numbers[1] = 32; numbers[2] = 42; foreach(int i in numbers) Console.WriteLine(i); } catch { Console.WriteLine("Something went wrong!"); } Console.ReadLine(); |
إدارة الاستثناءات في C#
اسمحوا لي أن أقدم لكم صديقنا الجديد الذي يأتي لمساعدتنا عندما يتعلق الأمر بمعالجة الأخطاء.
منع try..catch الآن ، قم بتشغيل البرنامج أعلاه على جهاز الكمبيوتر الخاص بك وشاهد الفرق بنفسك.
الآن ، بدلاً من Visual Studio أو بيئة نظام التشغيل التي تخبرنا أن لدينا مشكلة خطيرة ، فمن الأفضل إدارة هذا الخطأ بأنفسنا وإرسال رسالة مناسبة إلى المستخدم
في المثال أعلاه ، أخبرنا مستخدمنا عند إنشاء هذا الخطأ ، أن هناك مشكلة.
لكن من الأفضل عدم تحديد نوع المشكلة.
نعم ، يمكنك أيضًا القيام بذلك:
1 2 3 4 | catch(Exception ex) { Console.WriteLine("An error occured: " + ex.Message); } |
كما ترى ، أضفنا شيئًا ما إلى العبارة catch الآن يمكننا الإعلان عن الاستثناء الذي حدث.
توجد أنواع مختلفة من الاستثناءات في c# ، وكلها تستند إلى الفئة Exception.
باستخدام الكود أعلاه ، يتم توفير شرح مفهوم لنوع المشكلة. كما هو مذكور أعلاه ، Exception هو النوع الأكثر شيوعًا للاستثناء.
إدارة الاستثناءات في C#
تخبرنا قواعد الاستثناء أن نستخدم دائمًا الاستثناء الأكثر عمومية في النهاية عند معالجة الاستثناءات.
بالطبع ، هناك طرق مختلفة يمكنك من خلالها اكتشاف نوع الاستثناء.
على سبيل المثال ، عندما لا نتعامل مع أخطاء مثل هذه حتى الآن ، سيخبرنا Visual Studio بالاستثناء الذي حدث ، أو يمكنك الوصول إلى نوع الاستثناء على النحو التالي.
1 | Console.WriteLine("An error occured: " + ex.GetType().ToString()); |
نتيجة الكود أعلاه لا شيء باستثناء IndexOutOfRangeException.
لذلك يتعين علينا التعامل مع هذا الاستثناء بأفضل شكل ممكن ولكن لا شيء يقيدنا في التعامل مع أنواع مختلفة من الاستثناءات.
يمكنك القيام بأشياء مختلفة في بعض الأحيان ، على سبيل المثال ، يمكنك القيام بما يلي:
1 2 3 4 5 6 7 8 | catch(IndexOutOfRangeException ex) { Console.WriteLine("An index was out of range!"); } catch(Exception ex) { Console.WriteLine("Some sort of error occured: " + ex.Message); } |
كما ترى ، في البداية نبحث عن الاستثناء IndexOutOfRangeException.
بالطبع ، كان بإمكاننا فعل ذلك بطريقة مختلفة. يمكن لمجموعة الاستبدال catch جنبًا إلى جنب مع الفئة Exception القيام بذلك بالنسبة لنا ، نظرًا لأن جميع الاستثناءات مشتقة من هذه الفئة.
ومع ذلك ، من الأفضل دائمًا كتابة الاستثناءات الأكثر تحديدًا أولاً.
شيء آخر يجب معرفته حول الاستثناءات هو كتلة finally.
يمكن وضع الكتلة finally في نهاية مجموعة الكتل catch.
ذلك يعتمد على الاحتياجات الخاصة بك.
سيتم تنفيذ الكود الذي تكتبه في الكتلة finally سواء حدث الاستثناء أم لا. هذه الكتلة مفيدة بشكل خاص عندما تريد إغلاق المراجع والكائنات.
بالطبع ، نظرًا لحقيقة أن الأمثلة التي قدمناها في هذه المقالة بسيطة جدًا ، لا نحتاج إلى أي تنظيف ، ومع ذلك ، تم تضمين المثال التالي في المثال:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | int[] numbers = new int[2]; try { numbers[0] = 23; numbers[1] = 32; numbers[2] = 42; foreach(int i in numbers) Console.WriteLine(i); } catch(IndexOutOfRangeException ex) { Console.WriteLine("An index was out of range!"); } catch(Exception ex) { Console.WriteLine("Some sort of error occured: " + ex.Message); } finally { Console.WriteLine("It's the end of our try block. Time to clean up!"); } Console.ReadLine(); |
إذا قمت بتشغيل الكود أعلاه ، فسترى أنه يتم تنفيذ كل من كتل الاستثناءات والكتل finally.
شيء آخر مهم يجب معرفته هو أن الشفرة الموضوعة بعد الاستثناء لن يتم تنفيذها.
في المثال أعلاه ، بعد حدوث الاستثناء وتنفيذ الكتل ذات الصلة ، سيتم تنفيذ السطر فقط (Console.ReadLine) ولن يصل المترجم إلى الحلقة foreach.
أخيرا نتمنى أن يكون درس إدارة الاستثناءات في c# قد أفادكم
يسعدنا إثراء الموضوع من خلال تعليقاتكم و استفساراتكم المفيدة
مع تحيات موقع hdegy