Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Операторы обработки исключительных ситуаций




ПРЕОБРАЗОВАНИЕ ТИПОВ

СОВМЕСТИМОСТЬ ПО ПРИСВАИВАНИЮ

СОВМЕСТИМОСТЬ ТИПОВ

ИДЕНТИЧНОСТЬ ТИПОВ

Если при объявлении использовать один и тот же идентификатор или несколько переменных объявляются с помощью одного описания, то такие типы идентичны. Например


Type Int = Integer;

Var n: Int; k: Integer;

vl, v2: Array[1..10] of Real;


 

В данном случае vl и v2 идентичны, пик идентичны, но если объявле-Ho:Var vl: Array[1..10] of Real; v2: Array[1..10] of Real;, то vl и v2 не идентичны.

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

• типы идентичны;

• один тип представляет тип-диапазон другого;

• для объявления используется один и тот же базовый тип;

• оба типа - целые типы;

• оба типа - вещественные типы;

• один тип - строка типа PChar, другой - массив символов с индексацией
элементов, начинающейся от нуля.

Чтобы присваивание было корректным, необходимо выполнение сле­дующих условий:

• идентичность типов;

• совместимость типов, причем значение типа слева от знака присваива­
ния должно находиться в границах возможных значений типа справа от зна­
ка присваивания;

• слева от знака присваивания - вещественный тип, а справа - целый
тип;

• слева - строка, кроме типа PChar, справа - любая строка;


• слева - строка, кроме типа PChar, справа - символ.

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

Type ByteRec = record

Lo, Hi:byte; End;

WordRec = record

Lo, Hi:word; End;

Var B:byte; W:word; L:LongInt;,

TO МОЖНО записать:

L:=LongInt(W>; В: =ByteRec(W).Lo;

ByteRec(W).Hi:=0;

W:=WordRec(L).Lo; B:=ByteRec(WordRec(L).Lo).Hi;.

К специальным функциям и процедурам преобразования типов относит­ся множество подпрограмм, которые были использованы в программах вы­ше (Ord, IntToStr, StrToInt, Chr, FloatToStr, и др.).

 

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

1-Выполнение программы дойдет до операторов локальной обработки исключительной ситуации.

2. Управление будет передано встроенному глобальному обработчику исключительной ситуации.

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


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

В любом приложении, основанном на VCL, имеется глобальная пере-менная Application, являющаяся экземпляром класса TAppIication. Этод класс определен в модуле Forms и объединяет в себе все автоматически соз­дающиеся формы программы. Объект Application выполняет множество функций. Одна из них - обеспечение по умолчанию глобального механизма обработки исключительных ситуаций. Как только произойдет исключительная ситуация, объект Application генерирует событие OnException. Событию TApplication.OnException можно назначить собственный обработчик. Этот процесс называется делегированием событий. Если никакая процедура не назначена, то событие OnException вызывает стандартный обработчик.

Наряду с механизмом делегирования программную обработку ошибок можно осуществлять с помощью специальных операторов. Для этих целей определены две конструкции: Try...finally и Try...except. Они совершенно аналогичны по синтаксису, но различаются по назначению. Конструкция Try...finally имеет следующий синтаксис: Try <операторы> finally <операторы> End;.

Если в любом из операторов, размещенных между Try...finally, возни­кает исключительная ситуация, их выполнение прекращается и управление передается первому оператору, следующему за ключевым словом finally. После этого выполняются все операторы, стоящие между finally и End (опе­раторы, стоящие между finally и end, выполняются и в том случае, если ошибки не произошло).

Конструкция Try...finally применяется для довольно длительного пере­хвата исключительной ситуации, чтобы выполнить все полагающиеся перед завершением программы действия, прежде чем управление будет передано глобальному обработчику исключительных ситуаций или следующему уровню обработки ошибки. Эта конструкция не удаляет экземпляра объекта обработки исключительной ситуации, а только сообщает о ней.

Конструкция Try...except применяется для перехвата исключительной ситуации с последующей возможной обработкой, предусматривающей осво­бождение экземпляра объекта обработки исключительной ситуации, после чего выполнение программы продолжается, что и отличает, главным обра­зом, оператор Try...except от Try...finally. В этой конструкции есть необя­зательный дополнительный элемент, с помощью которого можно определить фактический тип возникшей исключительной ситуации, - элемент вида on...do:

Try

<операторы>

except

 
 

 


 

 

on В: Exception do <опвратор>

on E: Exception do <оператор>

<оператор>

End;

После ключевого слова else часто следует ключевое слово Raise, кото­рое переводит обработку ошибки на новый уровень (разрешается создавать вложенные блоки Try), например, на уровень глобального обработчика. Raise прерывает программу и выталкивает данные из стека. Однако, если будет записано Raise <процедура>, где процедура позволяет создать соб­ственное исключение, то выталкивания данных из стека не последует (если только внутри процедуры не возникнет ошибки). Процедура, записываемая после Raise, должна быть особого вида - она должна быть конструктором, так как она должна создать объект какого-либо класса исключений.

В заключение отметим, что блок от Try до Finally (или до Except) на­зывается блоком защиты ресурсов, а последующий блок до End - блоком очистки.

ПРИМЕР ПРИЛОЖЕНИЯ 11

Ап(Х). Вариант решения задачи приво-

 

Рис. 31

 

Построить график функции Y дитсянарис. 31.



Методика построения графиков приводится при описании примера 4. Однако данная функция обладает рядом особенностей, которые удобно ис­пользовать для иллюстрации исключений. Во-первых, функция не определе­на при отрицательных значениях аргумента. Во-вторых, она не определена при Х= 1 (деление на нуль). Для всех особых точек, естественно, отображать график не будем.

Для демонстрации рассматриваемых выше операторов воспользуемся методикой создания собственных исключений. Введем собственный тип

класс ErangeError=class (EmathError); - являющийся наследником встроенного класса EmathError. Используя ключевое слово Raise, созда­дим два исключения: одно - ErangeError - для фиксации случая отрица­тельного аргумента, а другое - переопределим стандартное EDivByZero. Если в программе встретятся другие исключения, то они будут обрабаты­ваться стандартно - в программе эти ситуации определяются просто ключе­вым словом Raise. Программа для решения примера 11 приводится ниже.

unit primll; interface

uses Windows, Messages, SysUtils, Classes, Graphics,

Controls, Forms, Dialogs, StdCtrls, Buttons, ExtCtrls; type

TForm1 = class(TForm)

Panel1: TPanel;

Button1: TButton;

BitBtnl: TBitBtn;

Edit1: TEdit;

Label1: TLabel;

Edit2: TEdit;

Label2: TLabel;

Imagel: TImage;

Label3: TLabel;

procedure Edit1KeyPress (Sender: TObject; var Key: Char); procedure Button1Click (Sender: TObject); end;

ERangeError = class(EMathError); var Form1: TForm1;




Поделиться с друзьями:


Дата добавления: 2014-12-29; Просмотров: 382; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.023 сек.