متى يتم استخدام استثناء محدد للمستخدم وبعض الأمثلة الجيدة/أفضل الممارسات؟

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

سؤال

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

هل الاستثناء الوحيد المعرفة من قبل المستخدم يمكن أن تحدد رسالة خطأ متسقة؟

ما هو المنطق الذي يمكن كتابته داخل الاستثناءات لجعلها أكثر فائدة حقًا؟

بعد كل شيء ، لا يمكنك القيام بذلك فقط: throw new Exception("Some Error Message");

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

المحلول

يعد وجود استثناءات محددة من قبل المستخدم مفيدًا لأنه يتيح لك التعامل مع أنواع مختلفة من الأخطاء بطرق محددة. لماذا يحدد .NET العديد من أنواع الاستثناءات المختلفة إذا كان بإمكانهم فقط رمي جميع الاستثناءات كـ System.Exception مع رسالة نصية مختلفة؟ السبب في وجود أنواع مختلفة من الاستثناءات في .NET هو أنه يمكنك التقاط أنواع أخطاء فردية والتعامل معها بشكل مختلف. هذا هو السبب نفسه الذي تحدده استثناءات المستخدم الخاصة بك - بحيث يمكنك تقديم استجابة مختلفة بناءً على نوع الاستثناء الذي حدث.

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

نصائح أخرى

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

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

على سبيل المثال ، في فئات التكوين الخاصة بي (والتي عادة ما تكون مغلفة حول ConfigurationManager) أنا رمي ConfigurationErrorsException عندما لا يمكن تحليل القيمة بشكل صحيح.

عند تحليل القيم المخصصة من النص أو أي شيء آخر يتطلب تنسيقًا محددًا وفشل التحليل ، أرمي أ FormatException

ولكن إذا بلدي BankAccount الكائن ليس لديه ما يكفي من المال بالنسبة لي لأسحب 10 جنيهات إسترلينية ثم سأكتب وأرمي InsufficentFundsException لأنه بهذه الطريقة يمكنني التعامل مع حالة الخطأ المحددة هذه ، إذا حدث ذلك.

أتمنى أن يساعد هذا (إلى حد ما).

لا ، فهي ليست فقط للرسائل. يمكنك البحث عن تلك المحددة من قبل المستخدم في قائمة استثناء كتلة الصيد.

catch(UserDefinedException){}
catch(Exception){}

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

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

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

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