Как лучше всего собирать и сообщать о непредвиденных ошибках в приложениях .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. Анализ и отчетность об этих ошибках.Например.10 наиболее частых ошибок или тайм-аутов происходят между 16:00 и 17: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