سؤال

أحاول الاستفادة من استخدام كتلة أكثر وأكثر في هذه الأيام عندما يكون كائن التي تطبق IDisposable ولكن شيء واحد أنا لم أحسب كيفية قبض استثناء كما في العادي حاول/catch/أخيرا ...أي رمز عينات لي نقطة في الاتجاه الصحيح ؟

تحرير:سؤال تم تعديل بعد قراءة من خلال الردود.كان "كيفية رمي استثناء في استخدام كتلة مع .NET 2.0?" ولكن في الحقيقة كنت أبحث عن وسيلة للقبض على هذه الاستثناءات داخل الحي.


أنا أبحث عن مزيد من التفاصيل على المتداول بلدي اصطياد كتلة داخل كتلة باستخدام.

تحرير:ما أردت تجنب الحاجة إلى استخدام try/catch/أخيرا داخل بلدي باستخدام كتلة مثل @بلير أظهر.ولكن ربما هذه مسألة غير...

تحرير:@بلير, هذا هو بالضبط ما كنت أبحث عنه شكرا على الرد المفصل!

هل كانت مفيدة؟

المحلول

أنا حقا لا أفهم السؤال هل رمي استثناء كما تفعل عادة.إذا MyThing تنفذ IDisposable, ثم:

using ( MyThing thing = new MyThing() )
{
    ...
    throw new ApplicationException("oops");
}

و thing.Dispose وسوف يطلق كما يمكنك ترك كتلة ، باستثناء ما القيت.إذا كنت ترغب في الجمع بين try/catch/أخيرا و استخدام, يمكنك إما عش لهم:

try
{
    ...
    using ( MyThing thing = new MyThing() )
    {
        ...
    }
    ...
}
catch ( Exception e )
{
    ....
}
finally
{
    ....
}    

(أو وضع try/catch/أخيرا في استخدام):

using ( MyThing thing = new MyThing() )
{
    ...
    try
    {
        ...
    }
    catch ( Exception e )
    {
        ....
    }
    finally
    {
        ....
    }    
    ...
} // thing.Dispose is called now

أو يمكنك انبسط using و تدعو صراحة Dispose في finally كتلة كما @المشاكسة أظهرت إضافة المزيد استثناء مناولة أو استرداد البرمجية التي تحتاج في finally (أو في catch).

تحرير:ردا على @Toran بيلوبس ، إذا كنت بحاجة إلى معالجة الاستثناءات جانبا من ضمان الخاص بك Dispose طريقة اتصلت عليك إما استخدام using و try/catch/finally أو انبسط using - لا تعتقد أن هناك أي طريقة أخرى لإنجاز ما تريد.

نصائح أخرى

نعم لا يوجد شيء مختلف عن رمي الاستثناءات في استخدام كتل.تذكر أن استخدام كتلة الأساس يترجم إلى:

IDisposable disposable = null;
try
{
    disposable = new WhateverYouWantedToMake();
}
finally
{
    disposable.Dispose()
}

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

تحتاج إلى محاولة بيان للقبض استثناء

إما يمكنك استخدام محاولة بيان في استخدام كتلة أو يمكنك استخدام باستخدام كتلة في كتلة المحاولة

ولكن تحتاج إلى استخدام كتلة المحاولة للقبض على أي استثناءات تحدث

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top