За наиболее распространенными ошибками можно заставить следить саму программу. Для этого в настройках проекта: Project Options (Проект Настройки) – на вкладке Compiler нужно выполнить действия:
· На панели Code generation (Генерация машинного кода) сбросьте флажок
Optimization (Оптимизация). Когда компилятор создает оптимизированный
код, он нередко вносит существенные улучшения в детали алгоритма, реализованного на Паскале. Например, если программист вводит в процедуре локальную переменную X для хранения промежуточных результатов:
Пример 3
то после оптимизации этого кода программа вполне может не использовать промежуточную переменную, а результат вычислений условно будет представлен так:
Это означает, что программист не сможет узнать значения локальной переменной X во время работы программы, потому что реально для нее не будет отводиться место в оперативной памяти.
· На панели Runtime errors (Ошибки времени выполнения) должны быть уста-
новлены флажки Range checking (Контроль выхода индекса за границы массива),
I/O Checking (Контроль ошибок ввода/ вывода) и Overflow checking (Контроль
переполнения при целочисленных операциях). Так как все типы Паскаля имеют
строго ограниченные диапазоны, то, например, при сложении двух чисел, близких к максимально допустимому значению, получится число, которое не укладывается в этот диапазон. Последний флажок позволяет обнаруживать такие ошибки.
· На панели Debugging (Отладка) установите флажки
· Debug information (Добавление отладочной информации), Local
symbols (Просмотр значений локальных переменных), Reference info (Просмотр структуры кода), Assertions (Включение процедуры Assert в машинный код) и Use Debug DCUs (Использование отладочных версий стандартных модулей библиотеки компонентов VCL).
Отключить генерацию машинного кода для этой процедуры можно с помощью флажка Assertions. Отладочные версии стандартных модулей содержат дополнительные режимы проверки корректности работы с компонентами Delphi 7.
Установка данных флажков приводит к тому, что при наличии соответствующих логических ошибок в программе (например, выход за границы массива) приведет к остановке выполнения программы и строка, в которой данная ошибка была допущена, будет подсвечена (в Примере 1 строка Arr[i]:=0). При этом Delphi может определить, в чем заключается ошибка. Например, если наводить курсор на различные переменные, сразу можно увидеть их значения во всплывающей подсказке.
Исключения
Нарушение в работе программы называется исключением. Обработку исключений (ошибок) берет на себя автоматически добавляемый и выполняемую программу код, который обеспечивает, в том числе вывод информационного сообщения. Вместе с тем с тем Delphi дает возможность выполнить обработку исключения. Наиболее часто встречающиеся исключения приведены в таблице:
Таблица 1. Стандартные классы исключительных ситуаций
Имя класса | Когда возникает |
EAbort | Данный класс предназначен для формирования и обработки «невидимых» для пользователя ошибок и используется разработчиками для управления ходом выполнения программы. Диалоговое окно с сообщением об ошибке не показывается |
EAbstractError | Попытка выполнения абстрактного метода |
EAccessViolation | Обращение к недоступной области памяти, например при выходе индекса за границы массива |
ЕAssertionFailed | Значение выражения в процедуре Assert равно False |
EControlC | Нажата комбинация клавиш CTRL+C в консольном приложении |
EConvert Error | Попытка неверного преобразования типов, например при вызове StrToInt('aaa') |
EDivByZero | Деление на ноль |
EExternal | Неверное функционирование системы Windows |
EExternalException | Невозможность распознать исключительную ситуацию средствами Delphi 7 |
EFilerError | При обращении к файлу. Наиболее частой причиной является отсутствие требуемого файла или, в случае использования сменного диска, отсутствие диска в накопителе |
EHeapException | Неверное динамическое распределение памяти или некорректная работа с указателями |
EFileStreamError | Ошибка ввода/вывода при использовании файла, название которого указано в параметре FileName данного класса |
EInOutError | Ошибка файлового ввода/вывода |
EIntError | Базовый класс, на основе которого созданы классы исключительных ситуаций при работе с целыми числами |
EIntOverfLow | Слишком большой результат при операции с целыми числами |
ElntfCastError | Неверное приведение типа объекта с помощью операции as во время обращения к интерфейсу |
ElnvalidCast | Неверное приведение типа с помощью операции as |
EInvalidOp | Неверная операция над числами с плавающей запятой |
Elnvalid Pointer | Неверная операция при работе с указателями |
EMathError | Базовый класс, на основе которого созданы классы исключительных ситуаций при работе с числами с плавающей запятой |
EOutOfMemory | Нехватка памяти |
EOverflow | Переполнение при выполнении операции над числами с плавающей запятой |
ERangeError | Значение выражения целого типа выходит за допустимый для этого типа диапазон |
EStackQverflow | Нехватка памяти в стеке. Возникает, когда используются слишком объемные локальные переменные (они создаются и хранятся в стеке) или когда слишком длинна последовательность вызовов вложенных подпрограмм |
EUnderflow | Результатом выражения над числами с плавающей запятой является число, которое слишком мало для его представления в программе |
EVariantError | Некорректное использование переменных типа Variant, например, при попытке неверного приведения типов |
EWinBZError | Ошибка 32-разрядной версии Windows |
EZeroDivide | Деление на ноль |
СОДЕРЖАНИЕ
Отладчик Delphi 1
Что такое отладка?. 1
Основные виды ошибок. 1
ОТЛАДЧИК DELPHI 2
Трассировка программы.. 2
Точки остановки (точки прерывания) программы.. 3
Группировка точек прерывания. 4
Действие. 5
Наблюдение значений переменных. 6
Просмотр и изменение значений. 8
ПРИЛОЖЕНИЕ. 9
Предотвращение и обработка ошибок. 9
Исключения. 10