Обработка ошибок - 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 - Выводит пользователю сообщение о том что что в данном диалоге(сеансе) уже произошла другая ошибка, поэтому работа не может быть сохранена. Нужно переоткрыть диалог.