إنشاء و طرح الاستثناءات ( ارشادات برمجة C# )

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

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

  • لا يمكن للأسلوب إتمام الوظائف المعرفة.

    على سبيل المثال، إذا كانت معلمة لأسلوب على قيمة غير صحيحة:

    static void CopyObject(SampleClass original)
    {
        if (original == null)
        {
            throw new System.ArgumentException("Parameter cannot be null", "original");
        }
    
    }
    
  • يتم إجراء اتصال غير مناسب لكائن، استناداً إلى حالة الكائن.

    مثال واحد لمحاولة الكتابة على ملف للقراءة فقط. وفي الحالات حيث لا تسمح حالة الكائن لعملية، طرح مثيل لـ InvalidOperationExceptionأو كائن استناداً إلى اشتقاق من هذه الفئة. هذا هو مثال عن الأسلوب الذي يطرح كائن InvalidOperationException:

    class ProgramLog
    {
        System.IO.FileStream logFile = null;
        void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {}
    
        void WriteLog()
        {
            if (!this.logFile.CanWrite)
            {
                throw new System.InvalidOperationException("Logfile cannot be read-only");
            }
            // Else write data to the log and return.
        }
    }
    
  • عندما يؤدي الوسيطة لأسلوب استثناء.

    وفي هذه الحالة، يجب اكتشاف الاستثناء الأصلي ArgumentException و يجب إنشاء مثيل. يجب تمرير الاستثناء الأصلي إلى الدالة الإنشائية ArgumentException كالمعلمة InnerException:

    static int GetValueFromArray(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch (System.IndexOutOfRangeException ex)
        {
            System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex);
            throw argEx;
        }
    }
    

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

تحتوي الاستثناءات على خاصية باسم Message. يجب تعيين هذه السلسلة لشرح أسباب الاستثناء. لاحظ أنه لا ينبغي وضع معلومات حساسة للأمان في نص الرسالة. بالإضافة إلى Message, ArgumentException تحتوي الخاصية المسماة ParamName التي يجب تعيينها إلى اسم وسيطة والتي أدت إلى طرح ‏‏الاستثناء. في حالة وقوع واضعة الخاصية ParamName يجب تعيين القيمة إلى value.

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

الأشياء يجب تجنبها عند طرح الاستثناءات

وتبين القائمة التالية ممارسات يجب تجنبها عند طرح الاستثناءات:

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

  • لا يجب إعادة الاستثناءات كقيمة الإرجاع أو معلمة بدلاً من الطرح.

  • لا تطرح System.Exception, System.SystemException, System.NullReferenceException، أو System.IndexOutOfRangeException عمدًا من التعليمات البرمجية المصدر الخاصة بك.

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

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

يمكن طرح برامج رمي فئة الاستثناء المعرفة مسبقاً في مساحة الاسم System (باستثناء مسبقاً بغير) ، أو إنشاء فئات ‏‏ استثناء الخاصة بهم من خلال اشتقاق من Exception. الفئات المشتقة يجب تعريفها على الأقل لأربعة دوال إنشائية: الدالة الإنشائية الافتراضية, واحده تقوم بتعيين خاصية الرسالة، والذي يعين كل Message و الخصائص InnerException. ويستخدم الدالة الإنشائية الرابعة بتسلسل الاستثناء. يجب أن تكون فئات ‏الاستثناء قابلة للتسلسل. فعلى سبيل المثال:

[Serializable()]
public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException() : base() { }
    public InvalidDepartmentException(string message) : base(message) { }
    public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }

    // Constructor needed for serialization 
    // when exception propagates from a remoting server to the client. 
    protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
        System.Runtime.Serialization.StreamingContext context) { }
}

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

مواصفات لغة #C

لمزيد من المعلومات، راجع مواصفات لغة #C. مواصفات اللغة هي المصدر النهائي لبناء جملة C# واستخدامها.

راجع أيضًا:

المرجع

استثناءات ومعالجة ‏‏ استثناء (البرمجة C# إرشادات)

معالجة الاستثناءات (دليل البرمجة لـ #C)

المبادئ

دليل البرمجة لـ #C