ما هو الصحيح .صافي استثناء لرمي عند محاولة إدراج وجوه مكررة في مجموعة ؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي عميل كائن له خاصية AssignedSoftware ، وهو جمع.

أريد أن تأكد من أن نفس قطعة من البرامج التي لم يتم تعيين أحد الأصول أكثر من مرة.في إضافة طريقة لا تحقق لمعرفة ما إذا كان البرنامج موجود بالفعل, وإذا كان كذلك, أريد أن رمي استثناء.

هل هناك معيار .صافي الاستثناء الذي يجب أن يكون رمي ؟ أو لا أفضل الممارسات تملي إنشاء بلدي مخصص استثناء ؟

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

المحلول

من مكتبة فئة تصميم المبادئ التوجيهية الأخطاء (http://msdn.microsoft.com/en-us/library/8ey5ey87(مقابل.71).aspx):

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

...

رمي ArgumentException أو إنشاء استثناء المستمدة من هذه الفئة إذا كان غير صالح يتم تمرير المعلمات أو الكشف عنها.

رمي InvalidOperationException إذا دعوة إلى مجموعة خاصية استرجاع قيمة أو الأسلوب غير مناسب بالنظر إلى الكائن الحالي.

هذا يبدو وكأنه كائن "الدولة باطل" سيناريو بالنسبة لي, لذلك أنا أختار InvalidOperationException على ArgumentException:المعلمات صالحة ، ولكن ليس في هذه المرحلة من الكائنات الحياة.

نصائح أخرى

لماذا InvalidOperationException تم قبول الإجابة؟!يجب أن يكون ArgumentException?!

InvalidOperationException ينبغي أن تستخدم إذا كان الهدف من وجود طريقة/خاصية تسمى ضدها ليست قادرة على التعامل مع الطلب بسبب uninit رائد الدولة الخ.المشكلة هنا ليس الكائن إضافتها لكن الكائن الذي يتم تمرير الكائن (إنه مغفل). تفكر في ذلك ، إذا كان هذا إضافة مكالمة جرت أبدا ، الكائن لا تزال تعمل بشكل طبيعي ، نعم!

هذا ينبغي أن يكون ArgumentException.

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

ربما يجب عليك رمي ArgumentException ، كما أن ما قاعدة مكتبة فئات.

حسنا ، إذا كنت حقا ترغب في جمع مع عناصر فريدة ، قد ترغب في إلقاء نظرة على HashSet كائن (متوفر في C# 3.0).

خلاف ذلك, هناك نوعان من الطرق التي يمكنك اتخاذها:

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

أي نهج يمكن أن تعتبر أفضل الممارسات طالما أنك تتفق في استخدامه.

أنا دائما أحب InvalidOperationException.ومع ذلك ، يمكن أيضا إنشاء مخصص استثناء ، أقول DuplicateSoftwareAssignmentException.


من إطار المبادئ التوجيهية تصميم:

"رمي ArgumentException أو إنشاء استثناء المستمدة من هذه الفئة إذا كان غير صالح يتم تمرير المعلمات أو الكشف عن.

رمي InvalidOperationException الاستثناء إذا اتصل مكان accessor أو الأسلوب غير مناسب بالنظر إلى الكائن الحالي".

الوضع الحالي يتضمن إشارات إلى فئة أخرى من الحالات.في هذه الحالة, الدولة بالفعل يتضمن إشارة إلى المثيل يجري المضافة ، وبالتالي الدعوة إلى الأسلوب غير مناسب.

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