كيفية إجبار استخدام المحاولة/الالتفاف حول طرق محددة

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

سؤال

أقوم بإنشاء مكتبة "مشتركة" لاستخدامها كمرجع في مشاريع الحلول المختلفة من قبل أعضاء الفريق الآخرين. الأساليب عادة void وظائف مع عدم وجود البيانات الفعلية التي تم إرجاعها.

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

إذا لم يكن الإجبار الصحيح ممكنًا ، فكيف يمكنني إنشاء سمة تنبثق عند التجميع لتحذير المطور حول متطلبات المحاولة/الصيد؟ (نوع من Obsolete ينسب).

أي نهج أخرى أفضل؟

تعديل:

هذا هو السيناريو الكامل:

لدي طريقة رمز تتصل بخدمة ويب لتحديث قيمة عن بُعد. التحديث أمر بالغ الأهمية. الطريقة التي تعمل بها بشكل جيد ولكن ماذا لو كانت خدمة الويب غير قابلة للوصول؟ المكالمة لا تُرجع أي قيمة.

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

المحلول

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

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

إذا كنت تريد التأكد من أن الكود يعمل بشكل صحيح: اختبره.

لا توجد سمات يمكنك استخدامها لهذا السيناريو. ربما يمكنك إنشاء قاعدة FXCOP أو ما شابه ذلك ، ولكن للأسباب المذكورة أعلاه: لا أوصي بذلك.

نصائح أخرى

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

يمكنك إرجاع فئة نتائج مخصصة:

public class Result
{
    public bool Okay { get; set; }
    public string Error { get; set; }
}

ثم:

var result = AttemptSomething();

if (!result.Okay)
{
    Console.WriteLine(result.Error);
}

أو ربما العودة string:

var error = AttemptSomething();

if (!String.IsNullOrEmpty(error))
{
    Console.WriteLine(error);
}

أو لديك الخطأ كخروج:

string error;
if (!AttemptSomething(out error))
{
    Console.WriteLine(error);
}

أو العودة Exception لكن لا يرمي.

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