معالجة و طرح الاستثناءات

يجب أن تكون التطبيقات قادرة علي معالجة الأخطاء التي تحدث أثناء تنفيذ بطريقة متناسقة. يوفر وقت تشغيل اللغة العامة نموذج لإعلام التطبيقات بالأخطاء بطريقة منتظمة. تشير كافة العمليات في .NET Framework إلى الفشل عن طريق طرح الاستثناءات.

يشمل هذا الموضوع على الأقسام التالية.

  • الاستثناءات في .NET Framework

  • أو استثناءات. وظائف معالجة بخطأ التقليدية

  • كيف يقوم وقت التشغيل بإدارة الاستثناءات

  • تصفية استثناءات وقت التشغيل

  • مواضيع ذات صلة

  • المرجع

الاستثناءات في .NET Framework

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

في .NET Framework، الاستثناء هو كائن يرث من الفئة System.Exception. يتم إلقاء الاستثناء من منطقة في التعليمات البرمجية حيث وقعت المشكلة. يتم تمرير الاستثناء لأعلى المكدس حتى يقوم التطبيق بمعالجته أو ينتهي البرنامج.

العودة إلى الأعلى

أو استثناءات.وظائف معالجة بخطأ التقليدية

عادةً، يعتمد نموذج معالجة الأخطاء في اللغة على طريقة فريدة للكشف عن الأخطاء و تحديد معالجات لتلك الأخطاء، أو يعتمد على آلية معالجة الأخطاء التي يتم توفيرها من قبل نظام التشغيل. يقوم وقت التشغيل بتنفيذ معالجة الاستثناء مع الميزات التالية:

  • يعالج استثناءات بدون النظر إلي اللغة التي تنشئ الاستثناء أواللغة التي تعالج الاستثناء.

  • لا يتطلب أي بناء جملة لغة معينة لمعالجة الاستثناءات، ولكنه يسمح لكل لغة بتعريف بناء الجملة الخاص به.

  • يسمح للاستثناءات بأن يتم طرحهم خلال العملية وحتي حدود الجهاز.

تقدم استثناءات العديد من المزايا عبر الأساليب الأخرى الخاصة بالإعلام بالخطأ مثل رموز الإرجاع. لا يصبح الفشل غير ملحوظ. لا تستمر القيم غير الصحيحة في الانتشار خلال النظام. ليس من الضروري أن تقوم بفحص رموز الإرجاع. يمكن إضافة التعليمات البرمجية الخاصة بمعالجة الاستثناءات بسهولة لزيادة وثوقية البرنامج. أخيراً، معالجة استثناء وقت التشغيل تكون أسرع من معالجة الخطأ باستخدام C++ التي تستند إلى Windows.

بسبب أن مؤشرات التنفيذ تجتاز بشكل روتيني كتل التعليمات البرمجية المُدارة وغير المُدارة، فيمكن أن يقوم وقت التشغيل بطرح أو التقاط استثناءات في كلا من التعليمات البرمجية المُدارة وغير المُدارة. يمكن أن تتضمن التعليمات البرمجية غير المُدارة كلا من استثناءات SEH الخاصة بنمط C++ و HRESULTS المستندة إلى COM.

كيف يقوم وقت التشغيل بإدارة الاستثناءات

يستخدم وقت التشغيل نموذج لمعالجة الاستثناء والذي يستند علي كائنات الاستثناء و الكتل المحمية من التعليمات البرمجية. يتم إنشاء الكائن Exception ليمثل الاستثناء عند حدوثه.

يقوم وقت التشغيل بإنشاء جدول معلومات عن كل ملف قابل للتنفيذ. يحتوي كل أسلوب من الملف التنفيذي علي صفيف مقترنة خاصة بمعلومات معالجة الاستثناء (التي يمكن أن تكون فارغة) في جدول معلومات الاستثناء. يصف كل إدخال في الصفيف كتلة محمية من التعليمات البرمجية، و أي عوامل تصفية للاستثناء مقترنة بتلك التعليمات البرمجية، و أي معالجات استثناء (العبارات catch). جدول الاستثناء هذا هو غاية في الفعالية و لا يتسبب في أي جزاء من الأداء في وقت المعالج أو في استخدام الذاكرة عند عدم حدوث الاستثناء. استخدم الموارد فقط عندما يحدث الاستثناء.

يمثل جدول معلومات الاستثناء أربعة أنواع من معالجات الاستثناء للكتل المحمية:

  • المعالج finally الذي يقوم بالتنفيذ كلما انتهت الكتلة، في حالتي حدوث ذلك بشكل عنصر تحكم عادي، أو عن طريق استثناء غير معالج.

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

  • معالج الأنواع المُصفاة والذي يعالج أي استثناء من الفئة المحددة أو أي من الفئات المشتقة منها.

  • معالج تصفية بواسطة المستخدم الذي يقوم بتشغيل التعليمات البرمجية المحددة من قبل المستخدم لتحديد ما إذا كان ستتم معالجة الاستثناء بواسطة المعالج المقترن أو يجب أن تمريره إلي الكتلة المحمية التالية.

كل لغة تقوم بتنفيذ معالجات الاستثناء هذه طبقًا للمواصفات الخاصة بها. على سبيل المثال، يوفر Visual Basic وصول إلي معالج تمت تصفيته بواسطة المستخدم من خلال مقارنة المتغير (باستخدام الكلمة الأساسية When) في العبارة catch; بينما C# لا يقوم بتنفيذ المالج الذي تمت تصفيته بواسطة المستخدم.

عند حدوث استثناء، يقوم وقت التشغيل ببدأ عملية من خطوتين:

  1. يبحث وقت التشغيل في الصفيف الأول عن الكتلة المحمية والتي تقوم بما يلي:

    • يحمي المنطقة التي تتضمن إرشادات التنفيذ الحالية.

    • يحتوي على معالج الاستثناء أو يحتوي على عامل التصفية الذي يعالج الاستثناء.

  2. في حالة حدوث مطابقة، فسينشئ وقت التشغيل الكائن Exception الذي يصف الاستثناء. ثم يقوم وقت التشغيل بتنفيذ كافة finally أو عبارات الخطأ بين العبارة حيث حدث الاستثناء و بين العبارة التي تعالج الاستثناء. لاحظ أن ترتيب معالجات الاستثناء هو هام; يتم تقييم معالج الاستثناء الأكثر عمقاً. لاحظ أيضاً أنه يمكن لمعالجات الاستثناء الوصول إلى الذاكرة المحلية و المتغيرات المحلة للروتين الذي يلتقط الاستثناء، ولكن يتم فقدان أية قيم المتوسطة في الوقت الذي يتم طرح الاستثناء فيه.

    إذا لم يحدث التطابق في الأسلوب الحالي، فسيبحث وقت التشغيل عن كل مستدعي للأسلوب الحالي، ثم يستمر في هذا المسار كاملاً حتى يصل للمكدس. إذا كان لم يكن هناك مطابقة للمستدعي، فسيتيح وقت التشغيل مصحح أخطاء بالوصول إلي الاستثناء. إذا لم يتم إرفاق المصحح مع الاستثناء، فسيقوم وقت التشغيل بإطلاق الحدث AppDomain.UnhandledException. إذا كان لم يكن هناك أي مستمعين لهذا الحدث، فسيفرغ وقت التشغيل متتبع المكدس وينهي التطبيق.

العودة إلى الأعلى

تصفية استثناءات وقت التشغيل

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

تقوم معالجات التصفية بواسطة النوع بإدارة نوع معين من الاستثناءات (أو الفئات المشتقة منها). يظهر المثال التالي معالج التصفية علي حسب النوع والذي تم تصميمه لالتقاط استثناء معين، في هذه الحالة، FileNotFoundException.

Catch e As FileNotFoundException
   Console.WriteLine("[Data File Missing] {0}", e)
catch(FileNotFoundException e) {
    Console.WriteLine("[Data File Missing] {0}", e);
}

تقوم معالجات الاستثناء المُصفاة من قبل المستخدم بالتقاط ومعالجة الاستثناءات استناداً إلى متطلبات تعريف للاستثناء. لمزيد من المعلومات حول استثناءات التصفية بهذه الطريقة، راجع استخدام استثناءات محددة في كتلة الالتقاط.

العودة إلى الأعلى

مواضيع ذات صلة

Title

الوصف

فئة وخصائص الاستثناء

يصف عناصر كائن الاستثناء.

هرمية التسلسل

توضح هذه المقالة الاستثناءات التي تم اشتقاق معظم الاستثناءات منها.

أساسيات معالجة الاستثناء

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

أفضل التدريبات علي معالجة الاستثناءات

تصف أساليب المقترحة لمعالجة الاستثناءات.

معالجة استثناءات توافق COM

توضح هذه المقالة كيفية معالجة الاستثناءات التي تم طرحها و التقاطها بواسطة تعليمات برمجية غير مُدارة.

كيفية: مخطط HRESULTs و استثناءات

توضح هذه المقالة تعيين الاستثناءات بين التعليمات البرمجية المُدارة و غير المُدارة.

العودة إلى الأعلى

المرجع

System.Exception

System.ApplicationException

System.SystemException