سؤال

في Java، إذا كانت وسيطة الإدخال لطريقة ما غير صالحة، فيمكننا طرح ملف IllegalArgumentException ( وهو من النوع RuntimeException).في لغة C++، لا توجد فكرة عن الاستثناءات المحددة وغير المحددة.هل هناك استثناء مماثل في معيار C++ والذي يمكن استخدامه للإشارة إلى استثناء وقت التشغيل؟أم أن هناك أسلوبًا شائعًا ليس في المعيار ولكن الجميع يتبعونه عمليًا في موقف كهذا؟

أم هل يجب علي إنشاء الاستثناء المخصص الخاص بي ورميه؟

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

المحلول

وعلى عكس جافا، لم يكن لديك C ++ "إطار موحد" ولكن فقط صغير (واختياري) مكتبة القياسية. وعلاوة على ذلك، هناك آراء مختلفة تحت المبرمجين C ++ ما إذا كان استخدام الاستثناءات <م> على الإطلاق .

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

إذا كنت تريد التمسك المكتبة القياسية، وجود نوع استثناء المتخصصة: invalid_argument (تمتد logic_error)

#include <stdexcept>

// ...
throw std::invalid_argument("...");

لالمرجع: هنا لمحة عامة عن أنواع استثناء القياسية المحددة (وثقت) في stdexcept:

exception
    logic_error
        domain_error
        invalid_argument
        length_error
        out_of_range
    runtime_error
        range_error
        overflow_error
        underflow_error

نصائح أخرى

والأمراض المنقولة جنسيا :: قد يكون domain_error ما كنت تبحث عنه، ولكن أظن عدد قليل جدا من الناس استخدامها. معظم الناس يستمدون أنواع استثناء الخاصة بها من الأمراض المنقولة جنسيا :: استثناء.

وأنا دائما استخدام std::invalid_argument لحجج غير مشروعة.

إذا كنت تقصد بكلمة "غير صالح" عدم استيفاء الطريقة للقيم المتوقعة، فيمكنك رميها

std::logic_error 
or 
std::runtime_error.

إذا كنت تقصد شيئًا متعلقًا بالإلقاء مثل كائن واحد لا يمكن تحويله إلى آخر - فلا يوجد استثناء لذلك ولن يتم طرحه تلقائيًا.

في الواقع سوف. ولكن فقط لـdynamic_cast<> على المراجع.سوف يرمي

std::bad_cast

لست متأكدًا من أنها فكرة جيدة أن ترمي هذه الفكرة بنفسك.

أفضل استخدام logic_error ومشتقاته في حالة قيام شخص ما بتمرير معلمة خاطئة لأنه خطأ منطقي:قام المبرمج بتمرير نوع خاطئ من الوسيطة.

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

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

وأنا شخصيا لم أر مثل هذا مجال التدقيق في أنظمة عملت على. بالتأكيد ليس للجميع.

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