c# - أفضل استثناء لوسيطة نوع عام غير صالحة




generics exception (8)

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

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

إذا كان المستخدم يحاول تمرير شيء لم يكن تعدادًا ، فأنا أرمي InvalidOperationException.

تصحيح:

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

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

تحرير 2:

واحد آخر ممكن:

System.ComponentModel.InvalidEnumArgumentException  

يتم طرح الاستثناء عند استخدام الوسائط غير الصالحة التي تمثل العدادين.

أنا حاليا أكتب بعض التعليمات البرمجية لـ UnconstrainedMelody التي لديها طرق عامة للقيام بها مع التعدادات.

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

فقط لجعل هذا ملموس ، إذا كان لدي شيء من هذا القبيل:

// Returns a value with all bits set by any values
public static T GetBitMask<T>() where T : struct, IEnumConstraint
{
    if (!IsFlags<T>()) // This method doesn't throw
    {
        throw new ???
    }
    // Normal work here
}

ما هو أفضل استثناء لرمي؟ ArgumentException يبدو منطقيًا ، لكنه عبارة عن وسيطة نوع أكثر من حجة عادية ، والتي يمكن أن تخلط بين الأشياء بسهولة. هل يجب علي تقديم فئة TypeArgumentException الخاصة TypeArgumentException ؟ استخدم InvalidOperationException ؟ NotSupportedException ؟ أي شيء آخر؟

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


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

أعتقد أن InvalidOperationException هو الاستثناء الأكثر ملاءمةً الذي يمكنك تنفيذه هنا.


سأذهب مع NotSupportedException . على الرغم من أن ArgumentException يبدو جيدًا ، إلا أنه يُتوقع فعلًا عندما تكون الوسيطة التي تم تمريرها إلى إحدى الطرق غير مقبولة. تعتبر وسيطة النوع خاصية مميزة للطريقة الفعلية التي تريد الاتصال بها ، وليست "وسيطة" حقيقية. يجب طرح InvalidOperationException عندما تكون العملية التي تقوم بها صالحة في بعض الحالات ولكن في حالة معينة ، تكون غير مقبولة.

يتم طرح NotSupportedException عندما تكون العملية غير مدعومة بطبيعتها. على سبيل المثال ، عند تنفيذ واجهة لا يكون فيها عضو معين منطقيًا لفئة معينة. هذا يبدو وكأنه وضع مماثل.



ماذا عن الوراثة من NotSupportedException. في حين أتفق معMerhrdad أنه من المنطقي ، أسمع وجهة نظرك أنه لا يبدو أن تناسب تماما. لذلك ، يمكنك الإرث من NotSupportedException ، وبهذه الطريقة ، لا يزال بإمكان الأشخاص الذين تم ترميزهم وفقًا لواجهة برمجة التطبيقات (API) الإمساك بـ NotSupportedException.


معرف الذهاب مع NotSupportedExpcetion.


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


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

هناك أساليب غير معتمدة في الفئة الأساسية ، مع توقع تنفيذ هذه الطرق في الفئات المشتقة بدلاً من ذلك. قد تقوم الفئة المشتقة بتطبيق مجموعة فرعية فقط من الأساليب من الفئة الأساسية ، ورمي NotSupportedException للأساليب غير المدعومة.

بالطبع ، هناك طريقة في NotSupportedException من الواضح أنها جيدة بما فيه الكفاية ، ولا سيما بالنظر إلى المعنى العام. بعد قولي هذا ، لست متأكدا مما إذا كان هذا صحيحًا.

نظرا لغرض غير UnconstrainedMelody ...

هناك العديد من الأشياء المفيدة التي يمكن القيام بها باستخدام أساليب / فئات عامة حيث يكون هناك قيد من النوع "T: enum" أو "T: delegate" - ولكن للأسف ، يتم حظر تلك في C #.

تعمل هذه المكتبة فائدة حول المحظورات باستخدام ildasm / ilasm ...

... يبدو وكأنه قد يكون هناك Exception جديد بالترتيب على الرغم من العبء الكبير من الإثبات الذي نحتاجه حقًا للالتقاء قبل إنشاء Exceptions مخصصة. قد يكون شيء من هذا القبيل InvalidTypeParameterException مفيدًا في المكتبة (أو ربما لا - هذه بالتأكيد حالة حافة ، أليس كذلك؟).

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





exception