ما هي أفضل طريقة لتجميع/الإبلاغ عن الأخطاء غير المتوقعة في تطبيقات .NET Window؟

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

سؤال

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

هناك عدد أكبر من منتجاتنا عبارة عن تطبيقات WinForm وWPF التي يتم تثبيتها في المواقع البعيدة.تحدث أخطاء غير متوقعة حتمًا، بدءًا من NullReferenceExceptions وحتى "أخطاء الشبكة العامة".وبالتالي تتراوح من أخطاء المبرمج إلى مشاكل البيئة.

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

نحتاج في هذه التقارير إلى معلومات مثل:

  1. اسم التطبيق
  2. إصدار التطبيق
  3. محطة العمل
  4. ربما لقطة الشاشة
  5. تفاصيل الاستثناء
  6. نظام التشغيل
  7. ذاكرة الوصول العشوائي المتاحة
  8. ادارة العمليات
  9. وما إلى ذلك وهلم جرا...

لا أريد حقًا إعادة اختراع العجلة من خلال تطوير هذا من الصفر.المكونات المطلوبة:

  1. مجموعة الأخطاء (التفاصيل كما هو مذكور أعلاه)
  2. خطأ "المرسل" (يلزم الانتظار في حالة عدم توفر قاعدة البيانات أو الإنترنت)
  3. قاعدة بيانات خطأ
  4. تحليل هذه الأخطاء والإبلاغ عنها.على سبيل المثالتحدث الأخطاء أو المهلات العشرة الأكثر شيوعًا بين الساعة 4:00 مساءً و5:00 مساءً.كيف يمكن مقارنة الأخطاء بين الإصدار x و y؟

ملحوظة:نظرنا الى التجميع الذكي كحل محتمل ولكن على الرغم من قربه فإنه لم يلبي احتياجاتنا تمامًا وكنت أتمنى أن أسمع ما يفعله المطورون الآخرون وما إذا كانت هناك بعض البدائل.

يحرر: شكرا على الإجابات حتى الآن.ربما لم أكن واضحًا في سؤالي الأصلي، فالمشكلة ليست في كيفية اكتشاف جميع الاستثناءات غير المعالجة، بل في كيفية التعامل معها وإنشاء محرك تقارير (تحليل) حولها.

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

المحلول

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

نصائح أخرى

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

[STAThread]
static void Main() 
{
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException);
    Application.Run(new FormStartUp());
}
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{
    // Log
}

لقد عثرت أيضًا على مقتطف الكود هذا باستخدام AppDomain بدلاً من ThreadException:

static class EntryPoint {
    [MTAThread]
    static void Main() {
        // Add Global Exception Handler
        AppDomain.CurrentDomain.UnhandledException += 
            new UnhandledExceptionEventHandler(OnUnhandledException);

        Application.Run(new Form1());
    }

    // In CF case only, ALL unhandled exceptions come here
    private static void OnUnhandledException(Object sender, 
        UnhandledExceptionEventArgs e) {
        Exception ex = e.ExceptionObject as Exception;
        if (ex != null) {
            // Can't imagine e.IsTerminating ever being false
            // or e.ExceptionObject not being an Exception
            SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating);
        }
    }
}

وهذه بعض الوثائق عنه: AppDomain استثناء غير معالج

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

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

لقد جعلوا Omea مفتوح المصدر للسماح للمجتمع بترقية قاعدة كود .NET 1.1 إلى الإصدار 2 أو 3.http://www.jetbrains.net/confluence/display/OMEA/this+link

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