سؤال

أنا أعمل على القانون القديم الذي يعتمد بشكل كبير على استثناء المواصفات السلوك الموصوف في اللغة القياسية.وهي تدعو إلى std::غير متوقعة() على استثناء مواصفات انتهاكات النموذج المبين أدناه.

foo() throw(T) { /*...*/ }

Nothrow المواصفات هي في الواقع ضمان أن لا رمي ، ولكن رمي(T) التي من المتوقع أن تكون انتهكت كل حسب التصميم و...لأن معيار تتوقع قدر يوفر آلية التعامل معها.

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

أنا إلا الآن مهمة تشمل جديدة لا علاقة لها وظيفة وقانون لا تتصرف كما هو متوقع تحت VC++ 9.0 بسبب الانحراف عن المعايير فيما يتعلق استثناء المواصفات التي أدخلت في 8.0.(المرجع: مايكروسوفت)

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

أنا من الحظ و تحتاج إلى تغيير بشكل صحيح الكتابي-طاعة التعليمات البرمجية قيد التشغيل على 350,000 خطوط من التعليمات البرمجية متطورة تماما في معالجة الخطأ فئة التسلسل الهرمي ؟ أو يمكنك التفكير في وسيلة من شأنها أن تساعد لي أن القوة std::غير متوقعة() السلوك ؟

تحرير: أنا توفير بعض المعلومات الأساسية.النظام في السؤال هو العام الدراسي التقويمات مولد مدرسة تخدم قليلا أكثر من 4,000 طالبا وطالبة موزعة أنا متأكد أن بعض الأرقام حتى الآن ، 6 درجات ~190 الطبقات ، بالإضافة إلى 12 الظاهري (طويلة-التعليم عن بعد) الطبقات.مينغو هو وارد كما هو أي مترجم آخر من VC++ 8.0 أو 9.0.ويرجع ذلك إلى اللوائح المتعلقة البرامج التي تخدم النظام التعليمي في هذا البلد.

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

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

المحلول

كما ذكرت البصرية ستوديو "مثيرة للاهتمام" طريقة التعامل مع استثناء المواصفات:

  • throw() وقد معناها العادي (وظيفة يجب عدم رمي)
  • أي شيء آخر (بما في ذلك استثناء مواصفات) هو تفسيره throw(...)

هناك طريقة للالتفاف حول هذا.ومع ذلك, C++ المجتمع الى حد كبير على أن الاستثناء المواصفات هي عديمة الفائدة.هل حقا بحاجة الى وقت التشغيل التحقق من خطأ أنواع القيت ؟ ربما السليم اختبار وحدة يمكن أن تحل محل الخاصة بك وقت الشيكات.

نصائح أخرى

لا أعتقد أن Visual C++ استثناء مواصفات السلوك في أي وقت مضى (أو ادعى أن تم) معايير المطابقة - حتى قبل 8.0 - لذلك أنا لست متأكدا من كيفية تطبيق كان يعمل.

من الممكن إجراء تغييرات مثل:

void f() throw(T)
{
    // ...
}

إلى:

void f()
{
    try
    {
        // ...
    }
    catch (T)
    {
        throw;
    }
    catch (...)
    {
        app_unexpected();
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top