سؤال

نحن نراجع واحد من الشركة نظام معالجة الاستثناء وجدت بضعة أشياء مثيرة للاهتمام.

معظم كتل التعليمات البرمجية (إن لم يكن جميعها) داخل try/catch و داخل كتلة catch جديد BaseApplicationException يتم طرح - الذي يبدو أنه قادم من المؤسسة المكتبات.أنا في قليلا من المتاعب هنا كما أنا لا نرى فوائد تفعل هذا.(رمي استثناء آخر في أي وقت واحد يحدث) واحد من المطورين الذين يستخدمون نظام لفترة من الوقت وقال انه بسبب تلك الفئة هو المسؤول عن نشر استثناء (إرسال رسائل البريد الإلكتروني وأشياء من هذا القبيل) ولكن لم يكن متأكدا جدا حول هذا الموضوع.بعد قضاء بعض الوقت في الذهاب من خلال مدونة أنا واثق تماما أن أقول أن كل ما يفعله هو جمع المعلومات عن البيئة من نشرها.

سؤالي هو:- هل من المعقول أن التفاف كافة التعليمات البرمجية داخل تحاول { } catch { } كتل من رمي جديد استثناء ؟ و إذا كان كذلك ، لماذا ؟ ما الفائدة ؟

رأيي الشخصي هو أنه سيكون أسهل بكثير لاستخدام HttpModule, sign up for الخطأ حدث من أحداث التطبيق, و تفعل ما هو ضروري داخل الوحدة.لو سلكت هذا الطريق سوف نفتقد شيئا ؟ أي عيوب ؟

رأيك هو محل تقدير كبير.

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

المحلول

أبدا1 catch (Exception ex).الفترة2.لا توجد وسيلة يمكنك التعامل مع جميع أنواع مختلفة من الأخطاء التي قد قبض.

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

بضعة أسباب هذا من أعلى رأسي:

  • اصطياد rethrowing مكلفة
  • عليك في نهاية المطاف فقدان تتبع المكدس
  • سيكون لديك منخفضة إشارة إلى نويس نسبة في التعليمات البرمجية الخاصة بك

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

التعامل مع الاستثناءات التي يتم القبض عليك, اسمع المناسبة الأحداث.عند القيام WinForms, سوف تحتاج إلى الاستماع System.AppDomain.CurrentDomain.UnhandledException, و - إذا كان الخاص به Threading - System.Windows.Forms.Application.ThreadException. لتطبيقات الويب ، هناك آليات مماثلة (System.Web.HttpApplication.Error).

أما بالنسبة التفاف إطار استثناءات في التطبيق الخاص بك (غير)الاستثناءات المحددة (أي throw new MyBaseException(ex);):تماما طائل ، رائحة كريهة.4


تحرير

1 أبدا هي كلمة قاسية جدا, وخصوصا عندما يتعلق الأمر الهندسة @أشار كريس في التعليقات.أنا أعترف أن يجري على المبادئ عندما كتبت أول هذا الجواب.

2,3 انظر 1.

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

نصائح أخرى

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

العيوب:

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

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

المزايا المحتملة:

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

ولكن في جميع الحالات تقريبا هذا هو رائحة سيئة وينبغي أن تستخدم بحذر.

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

أنا من مدرسة الفكر حيث حاول/ catch كتل ينبغي استخدام الاستثناءات لا rethrown.إذا كان لديك تنفيذ التعليمات البرمجية التي من المحتمل أن الخطأ ثم ينبغي التعامل معها, تسجيل شيء عاد.Rethrowing استثناء فقط يخدم الغرض إلى إعادة تسجيل الدخول في وقت لاحق في تطبيق دورة الحياة.

هنا هي وظيفة مثيرة للاهتمام حول كيفية استخدام HttpModule لمعالجة الاستثناءات: http://blogs.msdn.com/rahulso/archive/2008/07/13/how-to-use-httpmodules-to-troubleshoot-your-asp-net-application.aspx و http://blogs.msdn.com/rahulso/archive/2008/07/18/asp-net-how-to-write-error-messages-into-a-text-file-using-a-simple-httpmodule.aspx

تحقق من ELMAH.لا ما كنت تتحدث عن.بشكل جيد للغاية.

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

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

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

يبدو استثناء أن يتم طرح لا ينبغي أن نفذت استثناء.

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

أود أن استخدام HttpModule فقط عندما لا يمكن الحصول على أي أقرب إلى أين الاستثناءات هي في الواقع يحدث في التعليمات البرمجية.كنت لا تريد حقا وهو HttModule OnError الحدث الذي هو عملاق بيان التبديل اعتمادا على BaseApplicationexception خطأ المعلومات.

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

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

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