Каков наилучший способ сбора / сообщения о непредвиденных ошибках в .NET Window Applications? - PullRequest
6 голосов
/ 21 сентября 2008

Я ищу лучшее решение, чем то, что мы в настоящее время имеем дело с неожиданными производственными ошибками , не изобретая колесо.

Большим количеством наших продуктов являются приложения WinForm и WPF, которые устанавливаются на удаленных сайтах. Неизбежно возникают непредвиденные ошибки, от NullReferenceExceptions до «Общих сетевых ошибок». Таким образом, начиная от ошибок программиста до проблем среды.

В настоящее время все эти необработанные исключения регистрируются с использованием log4net и затем отправляются нам по электронной почте для анализа . Однако мы обнаружили, что иногда эти «отчеты» об ошибках содержат слишком мало информации для выявления проблемы.

В этих отчетах нам нужна такая информация, как:

  1. Имя приложения
  2. Версия приложения
  3. Рабочая станция
  4. Может быть, снимок экрана
  5. Сведения об исключении
  6. Операционная система
  7. доступная оперативная память
  8. Запуск процессов
  9. И так далее ...

Я действительно не хочу изобретать велосипед, разрабатывая его с нуля. Необходимые компоненты:

  1. Сбор ошибок (подробности, как указано выше)
  2. Ошибка «отправитель» (требуется очередь, если БД или Интернет недоступны)
  3. Ошибка базы данных
  4. Анализ и сообщение об этих ошибках. Например. 10 наиболее частых ошибок или тайм-аутов происходят между 16:00 и 17:00. Как ошибки сравниваются между версией х и у?

Примечание: Мы рассматривали SmartAssembly как возможное решение, но, хотя оно и близко, оно не вполне отвечало нашим потребностям, и я надеялся услышать, что делают другие разработчики и существуют ли альтернативы.

Редактировать: Спасибо за ответы до сих пор. Может быть, я не совсем понял в своем первоначальном вопросе, проблема не в том, как перехватить все незапланированные исключения, а в том, как с ними справиться и создать механизм отчетности (анализа) вокруг них.

Ответы [ 3 ]

5 голосов
/ 21 сентября 2008

Я бы предложил статью Джеффа Этвуда о Удобной для пользователя обработке исключений , которая выполняет большую часть того, что вы уже просили (Информация о приложении, Снимок экрана, Сведения об исключении, ОС, Запись в текстовые файлы и отправка по электронной почте), и содержит исходный код, так что вы добавляете дополнительный материал, который вам нужен.

2 голосов
/ 21 сентября 2008

Вы можете присоединиться к событию необработанного исключения и зарегистрировать его / подключиться к веб-сервису / и т. Д.

[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);
        }
    }
}

Вот некоторая документация по нему: Исключение необработанного домена приложения

За исключением простого обращения с ним, на самом деле нет универсального способа сделать это, который можно использовать повторно, его действительно нужно должным образом интегрировать с интерфейсом приложения, но вы можете настроить веб-сервис, который принимает имя приложения исключение, и все эти хорошие вещи и централизованный пункт для всех ваших приложений.

0 голосов
/ 21 сентября 2008

Возможно, вы захотите изучить функцию сообщения об ошибках, встроенную в JetBrain Omea Reader . Он имеет универсальный компонент обработки ошибок, который открывает диалоговое окно при возникновении непредвиденной ошибки. Пользователь может ввести дополнительные сведения перед отправкой проблемы в общедоступный веб-сервис сбора ошибок JetBrain.

Они сделали Omea открытым исходным кодом, чтобы позволить сообществу обновить базу кода .NET 1.1 до версии 2 или 3. http://www.jetbrains.net/confluence/display/OMEA/this+link

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...