كيف وأين يجب التعامل مع الاستثناءات في تطبيق ويب من 3 مستويات؟ على وجه التحديد استثناءات قاعدة بيانات SQL

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

سؤال

أقوم ببناء تطبيق ASP.NET على الويب القياسي من 3 مستويات ، لكنني أواجه مكانًا لفعل أشياء معينة - خاصةً التعامل مع الاستثناءات.

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

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

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

شكرًا

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

المحلول

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

  • لا تخفي تتبع المكدس أبدًا ؛ لا تستخدم أبدًا "Rethrow" ما لم يكن لأغراض أمنية تريد إخفاء ما حدث.
  • لا تشعر أنك بحاجة إلى معالجة خطأ في كل مكان. بشكل افتراضي ، في المستويات السفلية الخاصة بك ، فإن السماح للخطأ الفعلي الذي يصل إلى الطبقة العلوية ليس سيئًا. واجهة المستخدم/وحدة التحكم هي المكان الذي يجب أن تقرر فيه حقًا كيفية الرد على خطأ ما.
  • في كل مرحلة ، كما تريد بالضبط ما تريد أن يحدث إذا حدث خطأ ما. في كثير من الأحيان ، لن تكون قادرًا على التفكير في أي شيء أفضل من مجرد تركه يصل إلى الطبقة العليا أو حتى إلى جهاز العميل. (على الرغم من أنه في إنتاج الإنتاج الإبلاغ عن الإنتاج.) إذا كان هذا هو الحال ، فما عليك سوى الذهاب.
  • تأكد من التخلص من الموارد غير المدارة (أي شيء ينفذ قابلاً للتطبيق.) يعد الوصول إلى البيانات مثالًا رائعًا. أيضاً (أ) يتصل .تخلص() لاتصالك (خاصة) ، الأمر ، DataReader وما إلى ذلك في أخيراً كتلة ، أو (ب) استخدم ال باستخدام بناء الجملة/النمط مما يتأكد من حدوث التخلص المناسب.
  • ابحث عن الأماكن التي من المحتمل أن تكون فيها الأخطاء وحيث يمكنك البحث عن أخطاء معينة ، والرد (من خلال إعادة المحاولة ، وانتظار إعادة المحاولة الثانية ، ومحاولة هذا الإجراء بطريقة مختلفة ، وما إلى ذلك) ومن ثم نأمل أن تنجح. الكثير من معالجة الاستثناء الخاصة بك هو تحقيق النجاح ، وليس فقط للإبلاغ عن الإخفاقات بشكل جيد.
  • في طبقة البيانات ، يجب أن تفكر في ما يجب القيام به إذا حدث خطأ ما في منتصف عملية متعددة الخطوات. يمكنك السماح للخطأ الفعلي بالتراجع ، لكن هذه الطبقة يجب التعامل مع ترتيب الأشياء بعد خطأ. ستحتاج أحيانًا إلى استخدام المعاملات.
  • في الموقف غير المتزامن (إما (A.) بسبب سلاسل خيوط متعددة أو (B.) لأن منطق العمل هو معالجة بشكل منفصل على "آلات المهام" وكذا وتصرفت عليها لاحقًا) ، فأنت على وجه الخصوص بحاجة إلى خطة لأخطاء التسجيل.
  • أفضل رؤية "رمز معالجة الأخطاء" في 25 ٪ من تطبيقك أكثر من 100 ٪. 100 ٪ يعني أنك ربما تريد أن تبدو وتشعر بأن لديك معالجة خطأ. 25 ٪ يعني أنك قضيت وقتًا في التعامل مع الاستثناءات حيث تحتاج حقًا إلى التعامل معها.

نصائح أخرى

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

-كرب

أعتقد أن أفضل ممارسات لها للتعامل مع الاستثناءات في اللحظة المسؤولة الأخيرة. هذا يعني عادة على مستوى واجهة المستخدم (أي ، وحدة التحكم في تطبيق MVC أو في CodeBehind في تطبيق ASP.NET التقليدي). في هذا المستوى العالي ، فإن الكود "يعرف" ما يطلبه المستخدم ، وما يجب القيام به إذا لم ينجح شيء ما.

عادةً ما يؤدي التعامل مع الاستثناءات إلى أسفل في مكدس الاتصال إلى عدم قدرة رمز الاتصال على التعامل مع المواقف الاستثنائية بشكل صحيح.

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

إذا كنت بحاجة إلى "تنظيف" الأشياء قبل ترك الاستثناءات ، يمكنك دائمًا استخدام ملف finally منع لتنظيف. ليس عليك ذلك catch من أجل استخدام أ finally منع.

لا أعرف أي أمثلة على مواقع الويب الصغيرة المصممة لتسليط الضوء على معالجة الاستثناءات المناسبة ، آسف.

هذه ليست إجابة محددة على سؤالك ، ولكن إذا كنت مهتمًا بأفضل الممارسات ، فسأبحث عن أنماط وممارسات Microsoft:

دليل بنية التطبيق

أدلة تطبيقات الويب

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