سؤال

نحن نعتبر أن استثناء في التهيئة قد يحدث.لذلك نكتب محاولة / كتلة الصيد.

int f(){
    throw 1;
}

class A
{
public:
    A() try : _k(f())
    {}
    catch (int)
    {
        std::cout << "Exception 1" << std::endl;
    }

private:
    int _k;
};

لكن المصيد يعيد الاستثناء على مستوى واحد أعمق.هذا يعني أن الكود التالي

try
{
    A a;
} catch(int)
{
    std::cout << "Exception 2" << std::endl;
}

سوف الإخراج:

Exception 1
Exception 2

لماذا هذا محاولة / كتلة الصيد يتصرف يست بنفس الطريقة العادية محاولة / كتلة الصيد?

مثال على الكود الكامل: http://ideone.com/XjY2d

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

المحلول

يبدو أن سؤالك هو: لماذا يحاول مستوى الوظيفة / التقاط تلقائيا rethrow pacistoin؟مع إلقاء استثناء من بناء كائن، يعتبر هذا الكائن ميتا قبل أن يتعلق الأمر بالحياة.يتم تدمير جميع subobjects لها.وهذا هو، إذا تم إلقاء استثناء أثناء البناء، فلا يوجد كائن.إذا لم يرم الاستثناء، فستحصل على بدن كائن في يديك.من الواضح أن هذا غير مرغوب فيه.

نصائح أخرى

الكائن الذي تقوم ببناءه لم يتم بناؤه بالفعل، لذلك عودة بسيطة ليست خيارا.هذا النوع من Try0-Catch دائما Rethrows (ما لم تقم بإلقاء استثناء خاص بك من Fick Flow).

لأنها ليست كتلة محاولة الصيد العادية ولكن محاولة على مستوى وظيفة / الصيد.فإنه يعيد تلقائيا إلا إذا كنت تفعل ذلك صراحة باستخدام throw.

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