Обработка исключений в приложении, способы сбра информации об исключениях, настройка провайдера для отчета об ошибках, обработка неотловленных исключений, настройка лога сообщений

Flexberry Platform в сборке ICSSoft.STORMNET.UI.dll содержит классы для обработки исключительных ситуаций.

Простое отображение ошибки

Стандартный сценарий отображения Exception в специальной форме выглядит так:

try
{
  throw new Exception("Опаньки!");
  //...
}
catch(Exception ex)
{
  ErrorBox.Show(ex);
}

Способы сбора информации об исключениях

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

Итак, чтобы получить снимки экрана:

//Сделаем снимок только формы
Bitmap screen1 = ErrorBox.CaptureScreenShot(formToCapture);
//или снимем весь экран
Bitmap screen2 = ErrorBox.CaptureScreenShot();

Для того чтобы вывести эти снимки и сообщение:

//...
catch(Exception ex)
{
  List<Bitmap> screens = new List<Bitmap>();
  screens.Add(screen1);
  screens.Add(screen2);
  ErrorBox.Show(ex, screens, "Дополнительная информация об ошибке: переменная Х имеет значение:" + X);
}

Провайдеры отчётов об ошибках

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

  • Сохранить отчёт об ошибке на диск
  • Отправить отчет по электронной почте
  • Скопировать информацию в буфер обмена

Первые 2 варианта поддерживают сохранение изображений экрана (вся информация помещается в один zip-файл). В буфер обмена попадает только текстовая информация.

Чтобы добавить свой провайдер отчёта об ошибке, нужно унаследоваться от интерфейса IBugReportProvider и в конфигурационном файле добавить настройку BugReportProviders, в которой указать полные имена типов провайдеров, разделённые вертикальной чертой.

Важно: нельзя подключить 2 провайдера с одинаковым MenuItemName (будет подключен только первый из них).

Для работы с данными ошибки можно использовать статические методы класса ErrorBox.

Отправка сообщения об ошибке по электронной почте

В стандартном окне сообщения об ошибке существует возможность отправить письмо с сообщением об ошибке.

Форма исключения

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

Для запуска почтового клиента используется интерфейс MAPI. Адрес отправки, заголовок и текст сообщения могут быть настроены в конфигурационном файле приложения с помощью ключей BugReportEmailAddress, BugReportEmailTitle, BugReportEmailBody.

Пример:

<add key="BugReportEmailAddress" value="user@perm.ru" />
<add key="BugReportEmailTitle" value="Ошибка в Кошках или Лапах" />
<add key="BugReportEmailBody" value="Текст сообщения" />

Если указанный ключи не определены в конфигурационном файле, используются значение по умолчанию.

Адрес: пробел (пустую строку MAPI не принимает).

Тема: Ошибка {ИмяИсполнимогоФайла}.

Текст сообщения: В процессе работы пользователя {ИмяWindowsПользователя} в программе { ИмяИсполнимогоФайла} произошла ошибка. Дополнительная информация находится во вложении.

Замечание:

Для временного хранения архива используется папка Environment.SpecialFolder.InternetCache. Однако файл автоматически не удаляется, т.к. он не может быть удален до отправки сообщения.

Добавление информации о прикладной системе

Класс ICSSoft.STORMNET.Windows.Forms.ErrorBox содержит статический делегат, который позволяет собрать информацию о системе для того, чтобы она попала в информацию об ошибке.

/// <summary>
/// Делегат для сбора информации о прикладной системе
/// </summary>
/// <returns></returns>
public delegate string GetCurrentAppInfoDelegate();

/// <summary>
/// Делегат, который должен собрать информацию о прикладном приложении. Его результат будет присобачен к общей информации о системе.
/// </summary>
public static GetCurrentAppInfoDelegate GetCurrentAppInfo = null;

Обработка неотловленных исключений в прикладных системах

Чтобы пользователям не показывалась “страшная” форма с информацией об ошибке, если случилось неотловленное исключение, нужно подписаться на события Application.ThreadException и System.AppDomain.CurrentDomain.UnhandledException для того чтобы обработать их правильным образом.

Генератор приложений Flexberry добавляет строки

System.Windows.Forms.Application.ThreadException += ICSSoft.STORMNET.Windows.Forms.ErrorBox.ApplicationThreadException;
System.AppDomain.CurrentDomain.UnhandledException += ICSSoft.STORMNET.Windows.Forms.ErrorBox.CurrentDomainUnhandledException;

в метод Main приложения (в скобках программиста). Обработчики ICSSoft.STORMNET.Windows.Forms.ErrorBox.ApplicationThreadException и ICSSoft.STORMNET.Windows.Forms.ErrorBox.CurrentDomainUnhandledException просто запускают стандартную ErrorForm с информацией об исключении. Если требуется особая логика, то можно использовать собственный обработчик события.

Подключение лога ошибок

Чтобы включить лог ошибок достаточно указать такой атрибут в файле конфигурации:

<add key="ErrorLog" value="true" />

Все ErrorBox будут записывать ошибки в csv-файл в папку с приложением.