В Object Pascal введена специализированная процедура Assert, назначение которой - помощь в отладке кода и контроле над выполнением программы. Процедура является аналогом макроса ASSERT, который широко применяется практически во всех программах, написанных с использованием C и C++ и их библиотек. Синтаксис процедуры Assert: procedure Assert(expr : Boolean [; const msg: string]); Процедура Assert обычно применяется в следующих случаях:
· в начале процедуры или функции для проверки правильности переданных аргументов;
· в конце работы алгоритма для проверки правильности работы алгоритма;
· для проверки правильности выполнения "надежных" функций, то есть тех функций, которые всегда должны выполняться успешно всегда, и их невыполнение рассматривается как фатальная ошибка программы; хороший пример - функция CloseHandle вызываемая с верным дескриптором: в правильности выполнения этой функции можно практически не сомневаться, однако результат ее выполнения все-таки можно и нужно проверить.
Директива {$ASSERTIONS ON|OFF} позволяет компилировать вызовы assert или игнорировать их. Таким образом, в отладочной версии директива будет включена и компилятор будет генерировать код для вызовов assert, а в готовую версию этот код можно не включать, установив директиву {$ASSERTIONS OFF}.
Использование адреса ошибки и MAP-файла с информацией об адресах процедур
MAP-файл представляет собой список сегментов в скомпилированной программе с указанием типа сегментов и их расположения в готовом коде. Т. к. при возникновении исключения можно получить адрес источника исключения, анализ MAP-файла позволит найти, в какой процедуре находится вызвавший сбой код. Ручной анализ MAP-файла неудобен, однако возможно написание специального анализатора для него. Это направление выходит за рамки представленного здесь материала. Дополнительно о структуре MAP-файла можно прочитать на странице http://www.siteBuilder.ru/borlandMapFile.htm.
Использование повторного вызова исключения в обработчике try … except … end
В обработчике исключения можно вызвать его возобновление при помощи ключевого слова raise. При этом можно обеспечить передачу ему уникального кода, однозначно идентифицирующего место ошибки.
try
...
except
on E: Exception do
raise Exception.Create(E.Message + #13#10#13#10 +
'{17676641-B7C3-11D4-AAE7-000000000000}');
end
В приведенном примере строка уникального номера сгенерирована Delphi по нажатию клавиш Ctrl+Shift+G и представляет собой GUID (Globally Unique Identifier), уникальность которого гарантирована.