Подготовка сообщений при исключениях


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

Ресурсные строки могут быть непосредственно объявлены в программе, оформлены в виде файла специального формата, который можно либо использовать в виде библиотеки (DLL), либо включить в исполняемый файл.
а) Объявление строковых ресурсов в тексте программы.
Для объявления строковой константы в виде строкового ресурса следует объявить ее с помощью директивы ResourceString:

ResourceString SЕгг='Ошибка в работе программы!';

При необходимости такую константу можно использовать следующим образом:
• Raise Exception.Create(SErr); // Использование как обычной строки
• Raise Exception.CreateRes(@SErr); //Доступ через адрес

б) Подключение файла с ресурсными строками к исполняемому файлу.
Можно создавать файл с ресурсными строками с доступом к ним с использованием либо идентификаторов строк, либо целочисленных номеров строк.
• Использование файла с ресурсными строками и доступом к ним с использованием идентификаторов.

Последовательность действий по созданию ресурсного файла, подключению его к исполняемому файлу и использованию ресурсных строк следующая:
• Первоначально следует создать текстовый файл с расширением *.Inс
(в Блокноте Windows), включающий идентификаторы констант и их целочисленные значения, например, MyRes.Inc.

Const
ErrorOne=l;
ErrorTwo=2;
ErrorThree=3;

• Далее следует создать текстовый файл с расширением *,Rc, включающий таблицу идентификаторов констант и их значений, например,

MyRes.Rc.
Include "MyRes.Inc" STRINGTABLE
{
ErrorOne, "Первая ошибка"
ErrorTwo, "Вторая ошибка"
ErrorThree, "%d ошибка — %s"
}

• Будет создан файл ресурсов с расширением *.Res, например, MyRes.Res.
Для работы программы BRCC32.Exe необходима библиотека RW32Core.Dll.
• Для подключения Res-файл в том модуле, где используется строки из
ресурсов, необходимо в разделе Implementation поступить следующим образом

f$R *.DFM} {$R MyRes.Res} ($IMyRes.Inc}

После компиляции программы ресурс в виде массива строк будет включен в состав Ехе-файла.
• Для выборки ресурсов из таблицы строк можно воспользоваться следующим образом.
• Raise Exception.CreateRes(ErrorTwo); // Обычная строка
• Raise Exception.CreateResFmt(ErrorThree, [3, 'OK']); // С форматированием
• Возможно использование файла с ресурсными строками и доступом к ним с использованием целочисленных номеров строк.

Последовательность действий по созданию ресурсного файла, подключению его к исполняемому файлу и использованию номеров строк такая же, но без MyResInc

MyRes.Rc:
STRINGTABLE
{
1, "Первая ошибка"
2, "Вторая ошибка"
3, "%d ошибка — %s"
}
{SR *.DFMJ {$R MyRes.Res}

После компиляции программы ресурс в виде массива строк будет включен в состав Ехе-файла.
• Для выборки ресурсов из таблицы строк можно воспользоваться следующим образом.
• Raise Exception.CreateRes(2); // Обычная строка
Raise Exception.CreateResFmt(3, [3, 'OK']); // С форматированием
в) Использование библиотеки ресурсов массива строк. Для исключения ресурса из EXE файла можно создать отдельную библиотеку dll. Эта библиотека может использоваться для нескольких EXE.
• Поскольку при использовании библиотеки ресурсов идентификаторы
констант строк фактически не используются, то файл MyRes.Rc можно cделать так:
STRINGTABLE

{
1, "Первая ошибка"
2, "Вторая ошибка"
3, "%d ошибка — %s"
}

• Для выборки ресурсов из таблицы строк можно воспользоваться сле
дующим образом.
• Raise Exception.CreateRes(l); // Обычная строка
• Raise Exception.CreateResFmt(3, [3, 'OK']); // С форматированием
Для работы программы необходимо иметь два файла: файл-приложение (ЕХЕ) и файл-библиотеку (RUS).

Использование справочной системы
Базовый класс исключения, как уже отмечалось ранее, содержит поле, соответствующее ему свойство и несколько конструкторов, позволяющих использовать справочную систему в стиле Windows для вывода сообщения об ошибке или дополнительной информации об ошибке. Базовый класс объявлен (без учета обычных полей, свойств, конструкторов) следующим образом.

Constructor CreateHelp(Const Msg: String; AHelpContext: Integer);
Constructor CreateFmtHelp(Const Msg: String;Const Args: Array Of Const; AHelpContext: Integer);
Constructor CreateResHelp(Ident: Integer; AHelpContext: Integer); Overload; Constructor CreateResHelp(ResStringRec: PResStringRec;AHelpContext: Integer); Overload;

Всего шесть конструкторов.Они аналогичны обычным конструкторам, за тем исключением, что они содержат дополнительный параметр — AHelpContext, позволяющий сохранить в поле FHelp-Context численное значение, соответствующее идентификатору темы справочной системы и указанное в разделе [MAP] файл-проекта справочной системы (*.Hpj).

Таким образом, при вызове любого из указанных конструкторов в общем случае выводится типовое окно с сообщением об ошибке, текст которого указан в параметре Msg, а численное значение параметра AHelpContext записывается в поле FHelpContext текущего экземпляра исключения. В зависимости от используемого конструктора выводимое сообщение может форматироваться, а также выбираться из ресурсных строк.

С помощью свойства HelpContext возможен доступ к численному значению, хранящемуся в поле AHelpContext экземпляра исключения.

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

Application.HelpCommand(HELP_CONTEXT, E.HelpContext); — Выводит справку из справочной системы с численным значением, указанным в E.HelpContext.
Могут быть использованы также и другие методы глобального компонента Application для вывода тем из справочной системы. К ним относятся:
Application.HelpContext(Context: THelpContext): Boolean; — Выводит справку из справочной системы с численным значением, указанным в HelpContext.
Application.HelpJump(Const JumpID: String): Boolean; — Выводит справку, используя идентификатор темы (в апострофах), указанный в JumpID.

Перехват всех вызовов справочной системы можно сделать в обработчике события OnHelp глобального компонента Application. .

Протоколирование ошибок
Протоколирование, в том числе и ошибок, обычно применяется в операционных и сетевых программах. Тем не менее, использовать протоколирование ошибок можно и при разработке пользовательских программ. Это может позволить, особенно на начальной стадии их использования, определить основной спектр ошибок в работе программ, а затем их устранить.

Для протоколирования исключительных ситуаций в раздел Except блока Try или в обработчике события OnException можно включить код открытия специального текстового файла и запись в него, например, класс исключения, время его возникновения и т.п. В дальнейшем этот файл может быть просмотрен.

Var Ft:TextFile;
Begin
AssignFile(Ft, 'Except.Txt');
Try
Raise EDivByZero.Create("Деление на 0!');
Except On E: Exception Do Begin
If FHeExists('Except.Txt') Then Append(Ft) Else ReWrite(Ft);
WriteLn(Ft, E.ClassName+' '+DateToStr(Date)+' '+TimeToStr(Time)); ShowMessage(E.CIassName);
CloseFile(Ft); End;
End;
End;


Комментарии запрещены.




Статистика