Release.Обработка исключений
Для обработки исключений предусмотрена процедура Tests.ViewException.

pascal
 class function Tests.ViewException(E:Exception; Msg:String=''):boolean;

Рассмотрим пример использования этого метода.

pascal
var A, B:integer;
begin
   tests.Init;
   (*$ifdef test*)
   tests.Execute;
   (*$endif*)

   try
      B := 0;
      A := 1;
      A := trunc(A / B);
      Writeln(A);
   except
      on E:Exception do tests.ViewException(E, 'test viewException');
   end;

Как видите, уже после серии тестов при делении генерируется исключение. В обработчике этого исключения производится вызов tests.ViewException. Если после выполнения открыть файл error.txt, можно увидеть сообщение:

output
 18.06.2009 22:15 Error   : test viewException
                            Exception class: EZeroDivide: Floating point division by zero
                            Address: 00418320

Метод Tests.ViewException всегда возвращает false, поэтому можно заключить этот вызов в Assert. Тогда в файл дополнительно будет записаны имя файла и номер строки.

pascal
      on E:Exception do
         assert(tests.ViewException(E, 'test viewException'));

Кроме записи информации об исключении в файл error.txt выдается сообщение об исключении. (В режиме тестирования таких сообщений не бывает - только собщения, генерируемые самой IDE, если это указано в настройках).

Для вывода сообщений используется стандартная функция модуля SysUtils ShowException, которая выводит сообщение в консольное окно или как диалог в зависимости от типа приложения.

При необходимости можно установить собственный обработчик. Для этого предусмотрена функция

pascal
 class function Tests.SetOnViewError(F:TViewErrorProc):TViewErrorProc;

В качестве обработчика может использоваться функция вида:

pascal
   TViewErrorProc = function(E:Exception; Msg:String):boolean;

Если приложение не допускает вмешательства пользователя, при обработке исключения можно использовать вызов tests.SaveException.

pascal
 class procedure Tests.SaveException(E:Exception; Msg:String='');

Об исключении будет сделана запись в файле error.txt, но сообщений, требующих вмешательства не будет.

pascal
   try
      // ...
   except
      on E:Exception do tests.SaveException(E, 'test viewException');
   end;

Наверное, каждый разработчик сталкивался с ситацией, когда обработка исключения попадает внутрь цикла (часто это случается неявно при испоьзовании уже готовых частей кода внутри цикла). В этом случае при возникновении исключения наблюдается создание множества окон, закрыть которые не удается довольно долго. Для устранения этого неприятного эффекта реализована следующая схема. Независимо от установленного обработика сообщение об исключении появляется на экране не чаще чем один раз в две минуты (При этом запись в файл error.txt производится для всех выданных исключений).

Copyright © 2009-2014 by