Как лучше всего собирать и сообщать о непредвиденных ошибках в приложениях .NET Window?
-
02-07-2019 - |
Вопрос
Я ищу лучшее решение, чем то, с чем нам сейчас приходится иметь дело. неожиданные производственные ошибки, не изобретая велосипед.
Большую часть наших продуктов составляют приложения WinForm и WPF, которые устанавливаются на удаленных объектах.Неизбежно возникают непредвиденные ошибки, от NullReferenceExceptions до «Общие сетевые ошибки».Таким образом, начиная от ошибок программиста и заканчивая проблемами окружающей среды.
В настоящее время все эти необработанные исключения регистрируются с помощью log4net, а затем отправляются нам по электронной почте для анализ.Однако мы обнаружили, что иногда эти «отчеты» об ошибках содержат слишком мало информации для выявления проблемы.
В этих отчетах нам нужна такая информация, как:
- Имя приложения
- Версия приложения
- Рабочая станция
- Возможно скриншот
- Подробности исключения
- Операционная система
- Доступная оперативная память
- Запуск процессов
- И так далее...
Я действительно не хочу изобретать велосипед, разрабатывая его с нуля.Необходимые компоненты:
- Сбор ошибок (подробности указаны выше)
- Ошибка «отправитель» (требуется очередь, если БД или Интернет недоступны)
- База данных ошибок
- Анализ и отчетность об этих ошибках.Например.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