c# شرح استخدم كتلة "try-finally" دون كتلة "catch"




what is an exception how exceptions are handled in c#? (9)

يمكنك استخدامها للتأكد من حدوث بعض الإجراءات بعد محتوى try أو على استثناء ، ولكن عندما لا ترغب في استهلاك هذا الاستثناء.

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

كما أنك ستستخدمها عن غير قصد عندما using الكلمة المفتاحية ، لأن هذا يتحول إلى try-finally (وليس تحويلًا دقيقًا ، ولكن من أجل الجدل ، فهو قريب بما فيه الكفاية).

try
{
    TrySomeCodeThatMightException();
}
finally
{
    CleanupEvenOnFailure();
}

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

التحديث من توبياس: في finally لن يتم تشغيله إذا تم قتل العملية.

تحديث من بادي: الشروط عندما لا تنفذ في النهاية

المثال الأكثر شيوعًا الذي قد تراه هو التخلص من اتصال قاعدة البيانات أو المورد الخارجي حتى إذا فشلت الشفرة:

using (var conn = new SqlConnection("")) // Ignore the fact we likely use ORM ;-)
{
    // Do stuff.
}

يتحول إلى شيء من هذا القبيل:

SqlConnection conn;

try
{
    conn = new SqlConnection("");
    // Do stuff.
}
finally
{
    if (conn != null)
        conn.Dispose();
}

هل هناك حالات يكون فيها من المناسب استخدام كتلة try-finally دون كتلة catch ؟


إليك حالة استخدام استخدمها دائمًا (uhm ..):

int? x; //note the nullable type here!
try
{
    x = int.Parse(someString);
}
catch { } //don't care, let it just be null

using ما يعادل try-finally . ستستخدم فقط try-finally عندما تريد القيام ببعض التنظيف في finally ولا تهتم بالاستثناء.

أفضل نهج سيكون

try
{
   using(resource)
   {
       //Do something here
   }   
}catch(Exception)
{
     //Handle Error
}

القيام بذلك حتى تنظيف استدعاء using فشل ، لن تفشل التعليمات البرمجية.

هناك بعض الشرط في finally لن يتم تنفيذه.

  • إذا كان هناك أي Exception أو ExecutingEngineException .
  • يتم قتل العملية من مصدر خارجي.

آمل أن يجيب هذا عن شكوكك.


جرّب / أخيرًا: عندما لا ترغب في التعامل مع أي استثناءات ولكنك تريد التأكد من حدوث بعض الإجراءات (الإجراءات) سواء تم طرح استثناء من خلال الرمز المدعو أم لا.


شرح جيد باستخدام الكود:

void MyMethod1()
{
    try
    {
        MyMethod2();
        MyMethod3();
    }
    catch(Exception e)
    {
        //do something with the exception
    }
}


void MyMethod2()
{
    try
    {
        //perform actions that need cleaning up
    }
    finally
    {
        //clean up
    }
}


void MyMethod3()
{
    //do something
}

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

http://forums.asp.net/t/1092267.aspx?Try+without+Catch+but+with+finally+doesn+t+throw+error+Why+no+syntax+error+



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

انظر أيضا try-finally


1. يمكننا استخدام كتلة محاولة دون الصيد ولكن يجب علينا استخدام الصيد / أخيرا ، أي واحد منهم. 2. لا يمكننا استخدام سوى محاولة كتلة.


لا أعرف أي شيء عن C # ، ولكن يبدو أن أي شيء يمكن أن تفعله مع المحاولة أخيرًا ، يمكنك أن تفعل ذلك بشكل أكثر أناقة باستخدام بيان استخدام . C ++ لا تملك حتى أخيرا نتيجة RAII .





exception-handling