Генерация исключительной ситуации
ЗАДАНИЕ
1. Закон Республики Казахстан от 07.05.1997 «О гражданской обороне»
2. Аксиома о потенциальной опасности
3. Глоссарий
Классы иерархии 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
raiseException.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.