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

يستخدمون مبرمجون #C كتلة try لتقسيم التعليمات البرمجية التي قد تتأثر بالاستثناء ويستخدمون كتل catch لمعالجة أية استثناءات ناتجة. يمكن استخدام كتلة finally لتنفيذ تعليمات برمجية بغض النظر عن ما إذا كان تم طرح استثناء أم لا. هذا الموقف يكون ضروري أحياناً لأن التعليمات البرمجية التي تلي تركيب ال try/catch لن يتم تنفيذها إذا تم طرح استثناء. يجب أن تستخدم كتلة try مع إما كتلة catch أو كتلة finally كما يمكن تضمين عدة كتل catch. فعلى سبيل المثال:

try
{
    // Code to try here.
}
catch (SomeSpecificException ex)
{
    // Code to handle exception here.
    // Only catch exceptions you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}
try
{
    // Code to try here.
}
finally
{
    // Code to execute after try here.
}
try
{
    // Code to try here.
}
catch (SomeSpecificException ex)
{
    // Code to handle exception here.
}
finally
{
    // Code to execute after try (and possibly catch) here.
}

عبارة try من دون كتلة catch أو كتلة finally تؤدي إلى خطأ في المحول البرمجي.

كتل Catch

يمكن لكتلة catch تحديد نوع الاستثناء لالتقاطه. يسمى هذا النوع مُصفّي الاستثناء ويجب أن يكون نوع مشتق من Exception. بشكل عام، لا تقم بتحديد Exception في كتلة catch إلا إذا كنت عارفاً بكيفية معالجة كل الاستثناءات التي قد يتم طرحها في كتلة try أو إلا إذا قمت بتضمين عبارة throw في نهاية كتلة catch.

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

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

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

  • يمكنك إنشاء وطرح استثناء جديد وأكثر تحديداً. فعلى سبيل المثال:

    int GetInt(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch(System.IndexOutOfRangeException e)
        {
            throw new System.ArgumentOutOfRangeException(
                "Parameter index is out of range.");
        }
    }
    
  • لمعالجة الاستثناء جزئياً. على سبيل المثال، يمكن استخدام كتلة catch لإضافة إدخال لسجل الأخطاء ثم إعادة طرح الاستثناء لتمكين المعالجات اللاحقة من معالجة الاستثناء. فعلى سبيل المثال:

    try
    {
        // try to access a resource
    }
    catch (System.UnauthorizedAccessException e)
    {
        LogError(e);  // call a custom error logging procedure
        throw e;      // re-throw the error
    }
    

كتل finally

تمكنك كتلة finally من التنظيف للإجراءات المنفّذة في كتلة try. إذا كانت موجودة, يتم تنفيذ كتلة finally بعد تنفيذ كتلة try وكتلة catch. دائماً يتم تنفيذ كتلة finally بغض النظر عن ما إذا تم طرح استثناء أو ما إذا تم العثور على نوع استثماء مطابق لكتلة catch.

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

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

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // check for null because OpenWrite
    // might have failed
    if (file != null)
    {
        file.Close();
    }
}

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

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

راجع أيضًا:

المرجع

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

try-catch (مرجع #C)

try-finally (مرجع #C)

try-catch-finally (مرجع #C)

المبادئ

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

موارد أخرى

مرجع C#‎