هل يمكن أن يكون حقا وظيفة / طريقة دون الجسم ولكن مجرد كتلة حاول / catch؟

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

  •  22-07-2019
  •  | 
  •  

سؤال

لاحظ أن هذه الوظيفة لا يكون له "{" و "}" الجسم. مجرد كتلة حاول / catch:

void func( void )
try
{
    ...
}
catch(...)
{
    ...
}

وهذا هو قصد جزءا من C ++، أم أن هذه ز تمديد ++؟

هل هناك أي غرض لهذا بخلاف المستوى الالتفافية 1 من {}؟

والا ما كنت سمعت هذا حتى ركضت إلى <لأ href = "http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html" يختلط = "noreferrer" > http://stupefydeveloper.blogspot.com/2008/10/c-function-try-catch-block.html

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

المحلول

نعم، هذا هو المعيار. وظيفة تحاول كتل، كما انهم يسمى، لا أن تستخدم كثيرا للوظائف العادية، ولكن لالصانعين، فهي تسمح لك للقبض استثناءات القيت في قائمة initialiser.

ملاحظة أنه في حالة البناء، وسوف يكون دائما rethrown استثناء في نهاية أي كتل الصيد.

نصائح أخرى

نعم، هذا صحيح C ++. واحد الغرض لقد وجدت لذلك هو ترجمة الاستثناءات في القيم المرجعة، ويكون رمز ترجمة الاستثناءات في القيم المرجعة منفصلة عن رمز آخر في وظيفة. نعم، يمكنك return x; من كتلة الصيد مثل واحد يظهر لك (لقد اكتشفت مؤخرا فقط، في الواقع). ولكن أود أن ربما مجرد استخدام مستوى آخر من الأقواس ووضع حاول / catch داخل الدالة في هذه الحالة. وسوف تكون أكثر مألوف لمعظم المبرمجين C ++.

والغرض الآخر هو للقبض على استثناءات القيت من قبل قائمة منشئ مهيئ، والذي يستخدم بناء الجملة مشابهة:

struct f {
    g member;
    f() try { 
        // empty
    } catch(...) { 
        std::cerr << "thrown from constructor of g"; 
    }
};

وعشب سوتر لديه مادة جيدة على هذا: http://www.gotw.ca/gotw /066.htm .

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