اصطياد الأجسام الاستثناء حسب المرجع، المؤخرات، قضايا مدى الحياة

StackOverflow https://stackoverflow.com/questions/1860064

  •  13-09-2019
  •  | 
  •  

سؤال

النظر في التعليمات البرمجية التالية:

#include <iostream>
#include <stdexcept>

void foo()
{
    throw std::runtime_error("How long do I live?");
}

int main()
{
    try
    {
        foo();
    }
    catch (std::runtime_error& e)
    {
        std::cout << e.what() << std::endl;
    }
}

لماذا يمكنني التقاط الاستثناء بالرجوع، ليس كذلك std::runtime_error("How long do I live?") rvalue؟

كيف لا تزال كائن الاستثناء حيا في كتلة الصيد؟

حيث يتم بالضبط يتم طرح الأشياء الاستثناء المخزنة؟ ما هو حياتهم؟

لا يوجد حل صحيح

نصائح أخرى

في الفقرة 15.1.4 القياسية C ++:

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

لاحظ أنه في C ++ - نقاش قياسي، تشير معالج catch كتلة مع نوع الوسيطة الصحيح.

استثناء ذعر ليس مؤقتا - يحتفظ رمز الاستثناء الذي تم إنشاؤه بالمترجم نسخة دائمة منه. حتى تتمكن من ربطها بمرجع غير الاتصال.

عدل] أنا فقط التحقق من المعيار ويشير في الواقع إلى نسخة مؤقتة. ومع ذلك، فإن عمر المؤقت مضمون ليكون على الأقل طالما كان ذلك من معالج الاستثناء.

كما قال نيل، هناك ملاك مترجم داخلي يحدث. أيضا، كن على علم بأن المترجم يسمح بإنشاء أي عدد من النسخ من كائن الاستثناء.

مجد لمحاولة فهم تفاصيل اللغة. في الوقت نفسه، IMHO، من المهم للغاية فهم سبب لك ينبغي امسك استثناء بالرجوع إليه (ورميها بنفس القيمة)، مما سبب تستطيع.

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

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