هل سيعمل C ++ مع عدم وجود حجج داخل إطار آخر لإعادة تشغيل استثناء؟

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

  •  01-10-2019
  •  | 
  •  

سؤال

إذا كان لدي رمز مثل ما يلي:

try {
  doSomething();
} catch (...) {
  noteError();
}

void noteError() {
  try {
    throw;
  } catch (std::exception &err) {
    std::cerr << "Note known error here: " << err.what();
  } catch (...) {
    std::cerr << "Note unknown error here.";
  }
  throw;
}

هل سيتم طرح الاستثناءات الأصلية من كلا المكانين داخل الإطار السفلي من NoteRror ()؟

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

المحلول

الصياغة في المعيار (الفقرة 155.1/2) هي (منجم التأكيد):

عند إلقاء استثناء ، يتم نقل التحكم إلى أقرب معالج بنوع مطابق (15.3) ؛ "الأقرب" يعني المعالج الذي يقوم به النجوم المركبة ، أو CTOR-initializer ، أو جسم الوظيفة بعد الكلمة الرئيسية Try تم إدخالها مؤخرًا بواسطة مؤشر ترابط التحكم ولم يتم الخروج منها بعد.

متى تم الخروج من مجموعة "الخروج"؟ وفقًا للقواعد (الفقرة 15/1) ، جرب الكتل تنتهي بـ تسلسل من المعالجات ، لذلك تنتهي الكتلة عندما ينتهي المعالج الأخير. بعبارات أخرى:

try // <- start of try block
{
}
catch (whatever) // <- first handler
{
}
// ... more handlers
catch (whatever_again) // <- last handler
{
} // <- end of try block

لذا نعم ، الرمز الخاص بك على ما يرام. عند إعادة التشكيل ، فإن أقرب مجموعة Try لديها معالج مطابق (أي catch (...)) ، بحيث يتم إدخال المعالج.

نصائح أخرى

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

رمزك الجديد جيد أيضًا. لا بأس في التقاط كل شيء ثم استدعاء وظيفة أخرى تعيد تنفيذها للذهاب إلى معالج أكثر تحديداً. هذا ال مرسل الاستثناء المصطلح الموصوف في الأسئلة الشائعة C ++. يبدو غريبة بعض الشيء لإعادة تجديد الاستثناء بعد، بعدما انتهت كتلة الإرسال ، ولكن إذا كان ذلك throw حدث بيان بعد noteError عاد (داخل الأصل catch كتلة) بدلاً من مكانها الآن ، سيكون ذلك عاديًا تمامًا ؛ يظهر في المعيار ، § 15.1/6.

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