أي ما يعادل IllegalArgumentException من Java في C++
-
22-08-2019 - |
سؤال
في 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 ومشتقاته في حالة قيام شخص ما بتمرير معلمة خاطئة لأنه خطأ منطقي:قام المبرمج بتمرير نوع خاطئ من الوسيطة.
ولكن الأهم من ذلك كله أنني أحب استخدام التأكيد في مثل هذه الحالات.لأن أشياء مثل تمرير قيم أو أنواع خاطئة إلى وظيفتك يمكن أن تكون مقبولة فقط أثناء التطوير ويجب تجنب مثل هذه الفحوصات في الإصدار.
ويمكنك رمي استثناء القياسية أو القوائم الخاصة بك. قد تحتاج إلى تضمين معلومات إضافية في استثناء كنت رمي، والتي من شأنها أن تكون سببا وجيها لتفعل بنفسك.
وأنا شخصيا لم أر مثل هذا مجال التدقيق في أنظمة عملت على. بالتأكيد ليس للجميع.