سؤال

أنا الحفاظ على .صافي 1.1 تطبيق واحدة من الأشياء لقد تم تكليفي هو التأكد من أن المستخدم لا أرى أي غير ودية الخطأ الإخطارات.

لقد تم إضافة معالجات Application.ThreadException و AppDomain.CurrentDomain.UnhandledException, التي لا تحصل على ما يسمى.مشكلتي هي أن معيار CLR الخطأ الحوار لا يزال يتم عرض (قبل معالج الاستثناء يسمى).

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

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

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

المحلول

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

عندي مشروع رمز المادة هنا والتي ينبغي أن تساعد:

المستخدم ودية معالجة الاستثناء

نصائح أخرى

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

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

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

تحرير:فمن الممكن تعطيل (=هاك) خطأ-آلية تقديم التقارير المضمنة في ويندوز لذلك الإلزامية "تحطم وحرق" الحوار لا تحصل على عرضها عند التطبيق الخاص بك يذهب إلى أسفل.ومع ذلك ، فإن هذا يصبح فعال كل التطبيقات في النظام ، ليس فقط الخاص بك.

حدث استثناء غير معالج السلوك .صافي 1.× تطبيق نماذج Windows يعتمد على:

  • نوع الخيط الذي رمى استثناء
  • سواء كان ذلك حدث خلال نافذة معالجة الرسالة
  • إذا كان المصحح كان يعلق على العملية
  • على DbgJitDebugLaunchSetting إعداد التسجيل
  • على jitDebugging العلم في التطبيق.التكوين
  • إذا كنت تجاهلت نماذج Windows استثناء معالج
  • ما إذا كان يمكنك التعامل مع CLR استثناء الحدث
  • مرحلة القمر

السلوك الافتراضي من الاستثناءات غير المعالجة هي:

  • إذا كان يحدث استثناء على الخيط الرئيسي عند ضخ نافذة الرسائل انها اعتراضها من قبل نظام التشغيل Windows أشكال استثناء معالج.
  • إذا كان يحدث استثناء على الخيط الرئيسي عند ضخ نافذة الرسائل, فإنه سيتم إنهاء التطبيق العملية إلا إذا كان اعتراضها من قبل نظام التشغيل Windows أشكال استثناء معالج.
  • إذا كان يحدث استثناء على دليل ، threadpool ، أو finalizer الموضوع انه ابتلع من قبل CLR.

نقاط الاتصال على استثناء غير معالج هي:

  • نماذج Windows استثناء معالج.
  • JIT-التصحيح التبديل التسجيل DbgJitDebugLaunchSetting.
  • CLR استثناء غير معالج الحدث.

نموذج Windows المضمنة في معالجة الاستثناء التالية بشكل افتراضي:

  • يمسك حدث استثناء غير معالج عند:
    • استثناء على الترابط الرئيسي و لا المصحح المرفقة.
    • يحدث استثناء خلال نافذة معالجة الرسالة.
    • jitDebugging = خطأ في التطبيق.Config.
  • يظهر مربع الحوار المستخدم ويمنع إنهاء التطبيق.

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

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

ملاحظة إعداد التسجيل DbgJitDebugLaunchSetting تحت HKEY_LOCAL_MACHINE\Software.NetFramework.هذه واحدة من القيم الثلاث التي أنا على علم:

  • 0:يظهر للمستخدم مربع حوار يطلب "التصحيح أو إنهاء".
  • 1:يتيح استثناء من خلال CLR للتعامل مع.
  • 2:تطلق المصحح المحددة في DbgManagedDebugger مفتاح التسجيل.

في Visual Studio, انتقل إلى القائمة أدواتخياراتالتصحيحJIT تعيين هذا المفتاح إلى 0 أو 2.ولكن قيمة 1 هو عادة أفضل في نهاية المستخدم آلة.لاحظ أن مفتاح التسجيل هذا هو تصرف قبل CLR استثناء غير معالج الحدث.

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

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);

هذا تطبيق وحدة تحكم نماذج Windows " أو " التطبيق ؟ إذا كان .صافي 1.1 تطبيق وحدة التحكم هذه هي, للأسف, من خلال تصميم إنه أكد MSFT ديف في الثاني بلوق وظيفة المشار إليها:

راجع للشغل, على 1.1 آلة المثال من MSDN لا يكون المتوقع الإخراج ؛ انها مجرد أن السطر الثاني لا تظهر إلا بعد إرفاق مصحح أخطاء (أو لا).في v2 لقد انقلبت الامور بحيث UnhandledException الحدث الحرائق قبل المصحح تعلق ، والتي يبدو أن معظم الناس ما نتوقع.

يبدو وكأنه .NET 2.0 هل هذا أفضل (الحمد لله) ولكن بصراحة لم يكن لدي الوقت للذهاب مرة أخرى و تحقق.

إنه تطبيق نماذج Windows.الاستثناءات التي يتم صيدها من قبل التطبيق.ThreadException تعمل بشكل جيد و لا الحصول على القبيح .صافي استثناء مربع (طيب إلى إنهاء ، إلغاء إلى التصحيح ؟ الذي جاء مع هذا؟).

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

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

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