Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
все ответы.docx
Скачиваний:
8
Добавлен:
26.09.2019
Размер:
2.71 Mб
Скачать
    1. Контроль и преобразование типов

Поскольку реальный экземпляр объекта может оказаться наследником класса, указанного при описании объектной переменной или параметра, бывает необходимо проверить, к какому классу принадлежит объект на самом деле. Чтобы программист мог выполнять такого рода проверки, каждый объект хранит информацию о своем классе. В Object Pascal существуют операторы is и as, с помощью которых выполняется соответственно проверка на тип (type checking) и преобразование к типу (type casting).

Например, чтобы выяснить, принадлежит ли некоторый объект Obj, объявленный в программе как

Code:

var

Obj: TObject;

 

 

к классу TResourceGauge или его наследнику, следует записать

Code:

if Obj is TResourceGauge then { да, принадлежит } ;

 

Для преобразования объекта к нужному типу используется оператор as, например:

Code:

with Obj as TResourceGauge do CheckStatus;

 

 

Стоит отметить, что для объектов применим и обычный способ приведения типа:

Code:

with TResourceGauge(Obj ) do CheckStatus;

 

 

Вариант с оператором as лучше, поскольку безопасен. Он генерирует ошибку (точнее, исключительную ситуацию) при выполнении программы (run-time error), если реальный экземпляр объекта Obj несовместим с классом TResourceGauge. Забегая вперед, скажем, что ошибку приведения типа можно обработать и таким образом избежать досрочного завершения приложения.

  1. Обработка исключительных ситуаций. Стандартные классы исключений на примере языка Delphi.

Исключ. Ситуация-Это ошибка или сбой работы программы

Исключение – Специальный объект, создающийся при возникновении искл. Ситуаций и удаляемый после ее обработки.

Структурированная обработка исключений- механизм, в котором обработка ошибок отделена от основного кода программы.

Причины возникновения искл. Ситуаций:

1. программные (деления на ноль и тд)

2. аппаратные(работа с недоступным устр-вом)

Последовательность обработки искл. Ситуаций:

1. возникновение искл. Ситуации

2. создание объекта исключения, приостановка работы программы

3. передача объекта исключения обработчику

4. обработка исключения

5. уничтожение объекта исключения

6. продолжение программы

Уровни обработки исключений:

1. Программа (try – except, try – finally);

2. Среда разработки

3. Операционная система

  • Синхронные исключения могут возникнуть только в определённых, заранее известных точках программы. Так, ошибка чтения файла или коммуникационного канала, нехватка памяти — типичные синхронные исключения, так как возникают они только в операции чтения из файла или из канала или в операции выделения памяти соответственно.

  • Асинхронные исключения могут возникать в любой момент времени и не зависят от того, какую конкретно инструкцию программы выполняет система. Типичные примеры таких исключений: аварийный отказ питания или поступление новых данных.

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

Иерархия стандартных классов исключений

Класс Exception, наследующий от TObject, описывает наиболее общие характеристики и способы создания (конструкторы) исключения. Все остальные исключения, описанные как в библиотеках Delphi (стандартные), так и в конкретной программе (пользовательские) прямо или опосредовано наследуют от него и иерархически описывают все более специфические исключительные ситуации (ошибки ввода-вывода, ошибки математического сопроцессора, ошибки памяти, ошибки при работе с БД и т.п.).

Часть дерева стандартных исключений:

Exception

EAbort «Молчаливое исключение», для выхода из подпрограммы (Abort)

EConvertError Ошибка преобразования данных

EExternal Исключения, пришедшие от ОС (с дополнительной информацией)

EIntError Для целочисленных математических операций

EIntOverflow результат превысил размер регистра

ERangeError ошибка диапазона

EDivByZero целочисленное деление на ноль

EMathError Для операций с плавающей запятой

EZeroDivide деление на ноль с плавающей запятой

EInOutError Ошибка при вводе/выводе

EDatabaseError Ошибки, связанные с работой с БД

Пример:

объявление класса-исключения, наследующего от Exception.

type

EMyOwnException = class(Exception);