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

في C#, يتم نشر الأخطاء في برنامج وقت التشغيل من خلال البرنامج باستخدام تقنية تسمى الاستثناءات. الاستثناءات تم طرح برمز واجه خطأ وتم مصادفة بالتعليمات البرمجية التي يمكن تصحيح الخطأ. استثناءات can be تم طرح بواسطة the .NET Framework وقت تشغيل اللغة العامة (CLR) أو بواسطة تعليمات برمجية في a برنامج. مرة واحدة إستثناء يتم فيه طرح، نشر أعلى المكدس المكالمة حتى catchالعثور على بيان للاستثناء. Uncaught استثناءات are handled بواسطة a generic ‏‏ استثناء handler provided بواسطة the النظام that displays a حوار صندوق.

استثناءات are represented بواسطة فئات derived من Exception. This فئة identifies the نوع of ‏‏ استثناء و يحتوي على خصائص that have تفاصيل حول the ‏‏ استثناء. طرح إستثناء يتضمن إنشاء مثيل إستثناء-اشتقاق فئة اختيارياً تكوين خصائص الاستثناء وثم طرح الكائن باستخدام throwالكلمة الأساسية. فعلى سبيل المثال:


class CustomException : Exception
{
    public CustomException(string message)
    {

    }

}
private static void TestThrow()
{
    CustomException ex =
        new CustomException("Custom exception in TestThrow()");

    throw ex;
}

بعد an ‏‏ استثناء هو تم طرح, the وقت التشغيل checks the الحالي كشف إلى see whether it هو within a try حظر. إذا هو، أي catchكتل المقترنة tryتحديد حظر لمعرفة ما إذا كانت يمكن تصفية ‏‏ استثناء. Catchبكتل عادة تحديد أنواع ‏‏ استثناء؛ إذا النوعcatchحظر هو نفس النوع كـ ‏‏ استثناء، أو clكـs bكـe ‏‏ استثناء،catchأن معالجة حظر الأسلوب. فعلى سبيل المثال:

static void TestCatch()
{
    try
    {
        TestThrow();
    }
    catch (CustomException ex)
    {
        System.Console.WriteLine(ex.ToString());
    }
}

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

tryكشف أن يحتوي على المزيد catchحظر. اﻷول catchالعبارة التي يمكن معالجة ‏‏ استثناء هو تنفيذها؛ أي ما يلي catchعبارات، حتى ولو كانت متوافقة، يتم تجاهل. جذب لذلك، يجب دوماً أن طلبته كتل من الأكثر معين (أو مشتقة من معظم) إلى الخاص على الأقل. فعلى سبيل المثال:

static void TestCatch2()
{
    System.IO.StreamWriter sw = null;
    try
    {
        sw = new System.IO.StreamWriter(@"C:\test\test.txt");
        sw.WriteLine("Hello");
    }

    catch (System.IO.FileNotFoundException ex)
    {
        System.Console.WriteLine(ex.ToString());  // put the more specific exception first
    }

    catch (System.IO.IOException ex)
    {
        System.Console.WriteLine(ex.ToString());  // put the less specific exceptions last
    }
    finally 
    {
        sw.Close();
    }

    System.Console.WriteLine("Done");  // this statement is executed after the catch block
}

قبل catchحظر هو التنفيذ، وقت التشغيل التحقق من finallyكتل. Finallyتمكين كتل المبرمج لتنظيف أي الولاية الالتباس التي قد تكون متبقية من تم إحباطهاtryحظر، أو تحرير أي موارد خارجية (مثل المؤشرات الرسومات، والاتصالات قاعدة بيانات أو ملف تدفقات) دون انتظار حاوي المهملات في وقت التشغيل لإنهاء الكائنات. فعلى سبيل المثال:

static void TestFinally()
{
    System.IO.FileStream file = null;
    //Change the path to something that works on your machine
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(@"C:\file.txt");

    try
    {
        file = fileInfo.OpenWrite();
        file.WriteByte(0xF);
    }
    finally
    {
        // Closing the file allows you to reopen it immediately - otherwise IOException is thrown.
        if (file != null)
        {
            file.Close();
        }
    }

    try
    {
        file = fileInfo.OpenWrite();
        System.Console.WriteLine("OpenWrite() succeeded");
    }
    catch (System.IO.IOException)
    {
        System.Console.WriteLine("OpenWrite() failed");
    }
}

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

في حالة لا توافق catchحظر هو موجود تشغيل المكدس المكالمة بعد استثناء هو طرح، سيحدث أي من ثلاثة أشياء:

  • If the ‏‏ استثناء هو within a destructor, the destructor هو aborted و the الأساس destructor, if أي, هو called.

  • If the يتصل مكدس يحتوي على a ثابت الدالة الإنشائية, أو a ثابت حقل initializer, a TypeInitializationException هو تم طرح, مع the الأصلي ‏‏ استثناء تعيين إلى the InnerException خاصية of the جديد ‏‏ استثناء.

  • If the يبدأ of the مؤشر ترابط هو reached, the مؤشر ترابط هو منتهي.

راجع أيضًا:

المرجع

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

المبادئ

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