КАТЕГОРИИ: Архитектура-(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
Построить график функции 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; Просмотров: 406; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |