Генерация исключительной ситуации
ЗАДАНИЕ
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.