Тема урока: «Исключительные ситуации»
В языке Паскаль важную роль играет обработка исключительных ситуаций, связанных с попыткой выполнения во время работы программы какого-то действия, приводящего к ошибке или просто нарушающего ее функционирование и делающего невозможным дальнейшее нормальное выполнение.
Исключительные ситуации контролируются специальным обработчиком исключительных ситуаций. Он перехватывает практически все возникающие в программе ошибки, приостанавливает программу, не давая выполниться разрушительной команде, и сообщает об этом пользователю (окно Error) и программе, передавая ей информацию об обнаруженной ошибке в виде объекта, относящегося к специальной иерархии классов, описывающих исключительные ситуации. Базовым в этой иерархии является класс Exception. Он описан в модуле SysUtiLs.
Для оперативного вывода коротких сообщений можно использовать стандартную функцию ShowMessage, которая имеет один параметр-строку и отображает очень похожее Диалоговое окно с единственной кнопкой О К:
ShowMessage('Это сообщение от программы');
Генерация исключительной ситуации
Классы иерархии Exception обладают несколькими видами полезных конструкторов, которые можно применять для искусственной генерации соответствующей исключительной ситуации.
Таблица 1. Конструкторы классов иерархии Exception
Конструктор |
Параметры |
Create(const Msg: string) |
Параметр — строка, которая будет отображаться в диалоговом окне, информирующем о возникновении исключительной ситуации |
CreateRes(ResStringRec: PresStringRec) Overload; |
Параметр — строка сообщения, которая загружается из ресурсов программы
|
CreateFmt (const Msg: string const Args: array of const) CreateResFmt(ResStringRec: PresStringRec; const Args: array of const); overload; |
Массив Args содержит значения, на основе которых с использованием строки форматирования Msg (см. функцию Format) или ResStringRec (загружается из ресурсов программы) формируется результирующее сообщение
|
CreateHelp (const Msg: string AHelpContext: Integer);
|
Идентификатор раздела справки AHelpContext указывает, где пользователь сможет подробнее узнать о возникшей ошибке. Справочная система для текущей программы должна быть создана заранее |
Создание объекта и вызов нужного конструктора осуществляется с помощью ключевого слова raise:
if N < 1 then
raise Exception.Create('Значение переменной N меньше 1') ;1
Стандартные классы исключительных ситуаций
В библиотеках системы Delphi 7 имеется немало классов, ответственных за обработку различных исключительных ситуаций. В отличие от остальных типов Паскаля, названия которых принято записывать начиная с буквы Т, имена этих классов начинаются с буквы Е (Exception). Основные классы исключительных ситуации приведены в табл. 2
Таблица 2. Основные классы исключительных ситуаций
Имя класса |
Когда возникает |
EAbort |
Данный класс предназначен для формирования и обработки «невидимых» для пользователя ошибок и используется разработчиками для управления ходом выполнения программы. Диалоговое окно с сообщением об ошибке не показывается
|
EAbstractError |
Попытка выполнения абстрактного метода |
EAccessViolation |
Обращение к недоступной области памяти, например при выходе индекса за границы массива |
EAssertionFailed |
Значение выражения в процедуре Assert равно False |
ECoritrolC |
Нажата комбинация клавиш CTRL+C в консольном приложении |
EConvertError |
Попытка неверного преобразования типов, например при вызове StrToInt('aaa') |
EDivByZero |
Деление на ноль |
EExternal |
Неверное функционирование системы Windows |
EExternalException
|
Невозможность распознать исключительную ситуацию средствами Delphi 7 |
EHeapException |
Неверное динамическое распределение памяти или некорректная работа с указателями |
EFileStreamError |
Ошибка ввода/вывода при использовании файла, название которого указано в параметре FileName данного класса |
EInOutError |
Ошибка файлового ввода/вывода |
EIntError |
Базовый класс, на основе которого созданы классы исключительных ситуаций при работе с целыми числами |
EIntOverflow |
Слишком большой результат при операции с целыми числами |
ElntfCastError |
Неверное приведение типа объекта с помощью операции as во время обращения к интерфейсу |
EInvalidCast |
Неверное приведение типа с помощью операции as |
EInvalidOp |
Неверная операция над числами с плавающей запятой |
EInvalid Pointer |
Неверная операция при работе с указателями |
EMathError |
Базовый класс, на основе которого созданы классы исключительных ситуаций при работе с числами с плавающей запятой |
EOutOfMemory |
Нехватка памяти |
EOverflow |
Переполнение при выполнении операции над числами с плавающей запятой |
EPackageError |
Некорректная работа с пакетами (см. далее). Возникает только на этапе проектирования в среде Delphi 7 |
EPrivilege |
Попытка выполнить неразрешенную привилегированную инструкцию процессора |
EPropReadOnly |
Попытка занесения значения в свойство объекта, доступное «только для чтения» |
ERangeError |
Значение выражения целого типа выходит за допустимый для этого типа диапазон |
EStackOverflow |
Нехватка памяти в стеке. Возникает, когда используются слишком объемные локальные переменные (они создаются и хранятся в стеке) или когда слишком длинна последовательность вызовов вложенных подпрограмм |
EUnderflow |
Результатом выражения над числами с плавающей запятой является число, которое слишком мало для его представления в программе |
EVariantError |
Некорректное использование переменных типа Variant например при попытке неверного приведения типов |
EWin32Error |
Ошибка 32-разрядной версии Windows |
EZeroDivide |
Деление на ноль |
Иногда исключительные ситуации используют, чтобы изменить порядок выполнения операторов программы. Если, например, обнаружена ошибка при работе какого-либо метода, желательно не просто завершить его работу, а передать управление в часть программы, ответственную за исключительные ситуации. Для этого обычно применяют процедуру Abort (без параметров), тенериф ющую исключительную ситуацию класса EAbort.