سؤال

أنا أقرأ هذه الصفحة http://www.cplusplus.com/doc/tutorial/exceptions.htmlتقول إذا كتبت function() throw();لا يمكن طرح أي استثناءات في تلك الوظيفة.لقد حاولت في msvc 2005 كتابة throw() و throw(int) و throw() ولا شيء على الإطلاق.وكان لكل منهما نفس النتائج بالضبط.لا شئ.لقد رميت int وchar* ونوعًا آخر وتم القبض عليه بنفس الطريقة.يبدو أن الرمي لا يؤثر عليه على الإطلاق.ماذا تفعل وظيفة() throw() في الواقع؟

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

المحلول

هذه المقالة حصول على تفاصيل حول C ++ مواصفات استثناء وتنفيذ مايكروسوفت:

<اقتباس فقرة>   

ومايكروسوفت البصرية C ++ 7.1 يتجاهل مواصفات استثناء إلا إذا كانت فارغة. مواصفات استثناء فارغة تعادل __declspec(nothrow)، وأنها يمكن أن تساعد المترجم لتقليل حجم التعليمات البرمجية.

     

[...] إذا كان يرى مواصفات استثناء فارغة، وسوف أفترض أنك تعرف ما تقومون به، وتحسين بعيدا آليات للتعامل مع استثناءات. إذا يلقي الدالة على أي حال - حسنا، عار عليك. استخدام هذه الميزة إلا إذا كنت 100٪ إيجابي وظيفة الخاص بك لا رمي وسوف أبدا.

نصائح أخرى

وماذا كنت تجد أن هذا الإصدار من VC ++ لم تطبق الاستثناءات المواصفات. وأعتقد أن التي تم توثيقها كما تباين من هذا المعيار.

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

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

نقلا عن نظرة عملية على مواصفات الاستثناء:

(سوء) الفهم

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

إليك ما يعتقده الكثير من الناس أن مواصفات الاستثناءات:

  • ضمان أن الوظائف لن ترمي سوى استثناءات مدرجة (ربما لا شيء).

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

التوقعات المذكورة أعلاه ، مرة أخرى ، قريبة بشكل خادع من الصحة.

انظر الرابط للحصول على التفاصيل الكاملة.

ورمي استثناء لا يكفي، كنت في حاجة الى كتلة try {} catch() تصفية الاستثناءات. إذا لم يكن لتصفية الاستثناءات، ويسمى std::terminate() والبرنامج يخرج فجأة. خذ بعض الوقت للخروج ويكون الذهاب في هذا .

تم تصميم مواصفات الرمي لغرضين:

  1. ليكون بمثابة عقد بين الواجهة المنفذة ومستخدم الواجهة - تحدد الاستثناءات التي يمكن طرحها من طريقتك، ويعتبرها بعض الأشخاص جزءًا من الواجهة.(عقد) فحص علاء الاستثناءات في جافا.

  2. كوسيلة للإشارة إلى المترجم بأنه يمكنه تطبيق تحسينات معينة في حالة عدم إمكانية طرح أي استثناءات من طريقة/إجراء (إعداد معالجة الاستثناء يكلف شيئًا ما)

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

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