سؤال

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

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

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

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

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

المحلول

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

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

  • تفريغ المعلومات إلى ملف في دليل temp.
  • ابدأ تطبيق الإبلاغ عن الخطأ باسم الملف كوسيطة.
  • إنهاء العملية الفاشلة ، قبل أن تفعل شيئًا غبيًا.

يجب إزالة ملف Temp بواسطة تطبيق الإبلاغ عن الخطأ.

نصائح أخرى

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

ألق نظرة على الكود في هذا السؤال ، عملية تعليق في C#, ، ستحتاج إلى تعديله حتى لا يعلق موضوع واجهة المستخدم الرسومية وأي لا توجد خلفية بدأت ، ولكن يجب أن تقوم بالخدعة.

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

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