سؤال

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

لقد اجتزت اختبارًا دقيقًا، والتحقق من الصحة، والصلاة الصامتة، لكن هذا حادث برمجي سيئ ينتظر الحدوث.

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

آسف على السؤال الغامض ولكني أريد حقًا إغلاق الكتاب بشأن هذا الأمر مرة واحدة وإلى الأبد.

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

المحلول

مايكروسوفت فريق الأنماط والممارسات لقد قام بعمل جيد في دمج أفضل ممارسات إدارة الاستثناءات في مكتبة المؤسسة كتلة تطبيق معالجة الاستثناء

حدث إذا لم تستخدم مكتبة المؤسسة، I للغاية أنصحك بقراءة وثائقهم.يصف فريق P&P السيناريوهات الشائعة وأفضل الممارسات لمعالجة الاستثناءات.

للبدء، أوصي بقراءة المقالات التالية:

مقالات خاصة بـ ASP.NET:

نصائح أخرى

القاعدة الذهبية في التعامل مع الاستثناءات هي:

"التقط فقط ما تعرف كيفية التعامل معه"

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

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

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

يتذكر:الشيء الوحيد الأسوأ من عدم اكتشاف الاستثناءات هو التقاطها وعدم القيام بأي شيء.وهذا لن يؤدي إلا إلى إخفاء المشاكل الحقيقية.

قد يكون الأمر يتعلق بمعالجة الاستثناءات بشكل عام أكثر من ASP.NET المحدد ولكن:

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

ابدأ بمعالج استثناء عالمي مثل http://code.google.com/p/elmah/.

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

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

  • "ملفك كبير جدًا.الحد الأقصى للملفات هو 5 ميجابايت. "
  • "صورتك كبيرة.أقصى أبعاد هي 1200x1200. "
  • "ألبومك ممتلئ.الحد الأقصى لسعة التخزين هو 1 جيجابايت".
  • "كان هناك خطأ في التحميل الخاص بك.الهامستر لدينا غير سعيدة.يرجى العودة لاحقا."

إلخ.إلخ.

لا يوجد مقاس واحد يناسب الجميع لمعالجة الاستثناءات.

حسنًا، على المستوى الأساسي جدًا، يجب أن تتعامل مع حدث HttpApplication.Error في ملف Global.asax.يجب أن يقوم هذا بتسجيل أي استثناء يحدث في مكان واحد حتى تتمكن من مراجعة تتبع المكدس الخاص بالاستثناء.

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

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