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-файл в папку с приложением.