Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отладчик_Delphi.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
591.36 Кб
Скачать

Приложение Предотвращение и обработка ошибок

За наиболее распространенными ошибками можно заставить следить саму программу. Для этого в настройках проекта: ProjectOptions(Проект Настройки) – на вкладке 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

Деление на ноль