Обработка ошибок - QualitySolution/QSProjects GitHub Wiki
Сервис по обработке ошибок, то есть отправки всех необработанных исключений на сервер QS находится в пространстве имен QS.ErrorReporting
в библиотеке QS.Project.Desktop. Работа с сервисом осуществляется по GRPC, клиент для подключения к сервису находится в библиотеке QS.ErrorReporting.Client.
На сервер отправляется как информация о пользователе и другие метаданные, StackTrace исключения и лог программы. Сервер исключения с одинаковым StackTrace объединяет в одну ошибку, аккумулируя информацию об пользователях у которых она произошла. Код серверной части находится в проекте QS.Services.
Типы отчетов
Поддерживаются следующие типы отчетов об ошибках
- User - Пользовательский отчет об ошибке. Отправляется если пользователь написал описание ошибки в диалоге и нажал отправить. Обычно при такое отправке лог об ошибке не обрезается.
- Automatic - Автоматическая отправка сообщения об ошибке. Если пользователь в диалоге нажал понятно. В этом случае лог работы программы обрезается до указанного в настройках количества строк.
- Known - Отправка известной обработанной ошибки. Используется когда мы на уровне приложения отлавливаем исключение и знаем про него. Но хотим иметь возможность анализировать логи и то как часто такие исключения появляются в программе. В этом варианте статус ошибки на сервере сразу устанавливается в состояние "Известная". Чтобы не отвлекать при разборе ошибок.
Настройка модуля в GTK приложении
Так как в Gtk приложениях помимо необработанных исключениях .Net, надо отдельно подписываться на исключения произошедшие внутри вызовов GUI, класс UnhandledExceptionHandler для обработки необработанных исключение расположен в библиотеке QS.Project.Gtk.
Класс UnhandledExceptionHandler перехватывает все исключения в приложении и при необходимости показывает пользователю диалог или производит какие либо другие действия. Набор некоторых преднастроенных обработчиков исключений можно найти в пространстве имен QS.ErrorReporting.Handlers.
Ниже пример обычной настройки модуля в проекте:
UnhandledExceptionHandler unhandledExceptionHandler = new UnhandledExceptionHandler();
//Передаем в настройки GUI поток, чтобы обработчик мог отличать вызовы исключений из других потоков и не падал при этом в момент попытки отобразить диалог пользователю.
GtkGuiDispatcher.GuiThread = System.Threading.Thread.CurrentThread;
//Получаем все необходимые зависимости из контейнера.
unhandledExceptionHandler.UpdateDependencies(startupContainer);
//Подписываемся на необработанные исключения текущего приложения.
unhandledExceptionHandler.SubscribeToUnhadledExceptions();
Дополнительно уже после конфигурации и подключения к базе данных, когда пользователь определен и есть информация к какой базе мы подключены в модуль можно передать дополнительную информацию. Для этого стоит обновить зависимости из основного контейнера.
unhandledExceptionHandler.UpdateDependencies(AppDIContainer);
Переднастроенные обработчики
В библиотеках реализованы следующие обработчики:
ConnectionIsLost
- Выдает пользователю простое сообщение о проблемах с сетью, отправляет сообщение на сервер со статусом Known чисто для подсчета количества возникающих проблем. Пытается обработать все известные типы исключений.MySqlConnectorConnectionIsLost
- Тоже самое что и выше, но для библиотеки MySqlConnector.MySqlException1055OnlyFullGroupBy
- Сообщение о необходимости выключить режим 'only_full_group_by' на SQL сервере.MySqlException1366IncorrectStringValue
- Сообщение о использовании символов не поддерживающих кодировкой базы.MySqlExceptionAccessDenied
- Сообщение о отсутствии прав на уровне базы данных.MySqlExceptionErrorNumberLogger
- Является Middleware используемом для записи в лог кода ошибки MySqlException. Потом по этому коду можно такие ошибки обрабатывать.MySqlConnectorExceptionErrorNumberLogger
- Тоже самое что и вариант выше но для библиотеки MySqlConnector. Временно находится в QS.HistoryLog.Desktop так как пока только HistoryLog использует эту библиотеку.NHibernateFlushAfterException
- Выводит пользователю сообщение о том что что в данном диалоге(сеансе) уже произошла другая ошибка, поэтому работа не может быть сохранена. Нужно переоткрыть диалог.