Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Исключительные ситуации.doc
Скачиваний:
4
Добавлен:
09.11.2019
Размер:
113.66 Кб
Скачать

6

Разработка УБД

Тема урока: «Исключительные ситуации»

В языке Паскаль важную роль играет обработка исключительных ситуаций, свя­занных с попыткой выполнения во время работы программы какого-то действия, приводящего к ошибке или просто нарушающего ее функционирование и делаю­щего невозможным дальнейшее нормальное выполнение.

Исключительные ситуации контролируются специальным обработчиком исклю­чительных ситуаций. Он перехватывает практически все возникающие в программе ошибки, приостанавливает программу, не давая выполниться разрушительной ко­манде, и сообщает об этом пользователю (окно 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.