Лабораторная работа 10. Исключительные ситуации
Цель: изучить класс Exception и возможности при обработке ошибок. Класс Exception является прямым потомком базового класса TObject . Вместе со своими потомками он предназначен для обработки исключительных ситуация (исключений), возникающих при некорректных действиях программы: например, в случае деления на 0, при попытке открыть несуществующий файл, при выходе за пределы выделенной области динамической памяти и т. п. Рассматриваются основные свойства исключений и их использование для повышения надежности программ. При работе в среде Delphi эксперименты с исключениями плохо прослеживаются, т. к. при каждом исключении среда перехватывает управление программой. В этом случае бывает полезно отменить такое поведение среды. Для этого вызовете опцию Tools, Debugger Options и на странице Language Exceptions уберите флажок в переключателе Stop on Delphi Exceptions. Для обработки исключений в Object Pascal предусмотрен механизм защищенного блока, который может записываться в двух различных видах. Первый имеет следующий вид: try <операторы> except <обработчики исключений> else <операторы> end; Второй определяется в виде try <операторы> finally <операторы> end; Защищенный блок начинается зарезервированным словом try (попытаться [выполнить]) и завершается словом end. Существуют два типа защищенных блоков — except (исключить) и finally (в завершение), отличающихся способом обработки исключения. В блоке except порядок В блоке finally операторы в секции finally ... end получают управление всегда, независимо оттого, возникло ли исключение в секции try ... finally или нет. Если исключение возникло, все операторы в секции try ... finally, стоящие за «виновником» исключения, пропускаются и управление получает первый оператор секции finally ... end. Если исключения не было, этот оператор получает управление после выполнения последнего оператора секции try ... finally. Обработчики исключений в блоке except имеют такой синтаксис: on < класс исключения> do <оператор>; Здесь on, do — зарезервированные слова; <класс исключения> — класс обработки исключения; <оператор> — любой оператор Object Pas cal. Обратите внимание: имя класса служит своеобразным ключом выбора, а собственно обработка осуществляется оператором, стоящим за do (этот оператор может быть составным, так что обработка исключения может занимать произвольное количество операторов Object Pascal). Поиск нужного обработчика осуществляется с начала списка вниз до тех пор, пока не встретится класс, способный обрабатывать исключение данного типа. Если подходящего класса не обнаружено, управление передается операторам, стоящим за словом else, а если таковых нет, то выполняется умалчиваемая обработка исключения. Если важен лишь факт возникновения исключительной ситуации try ……….. except ShowMessage(‘Ошибка’); ……………… end; Защищенные блоки могут вкладываться друг в друга на неограниченную глубину и встречаться в блоке обработки исключительной ситуации. Класс Exception является родительским для всех классов исключений. У этого класса имеется множество дочерних классов, каждый из которых отвечает за конкретное исключение. При возникновении исключительной ситуации объекты классов обработчиков создаются и уничтожаются автоматически. Таких классов очень много, поэтому рассмотрим только некоторые: EAbort — обработка любой исключительной ситуации; EIntError — любая ошибка в целочисленных вычислениях, среди EMatcError — любая ошибка при выполнении вычислений с плавающей запятой, среди которых: EZeroDivide — вещественное деление на 0; EOverflow — переполнение; EInfalidArgument — аргумент функции вне допустимого диапазона; EArrayError — ошибка при работе с массивами; EConvertError— ошибка в функциях StrToInt и StrToFloat; EFOpenError — ошибка при открытии файла; EInOutError — любая ошибка в файловых операциях; EInvalidGridOperator — любая ошибка при работе с таблицами; EInvalidGraphOperator — недопустимая графическая операция. Рассмотрим еще некоторые исключительные ситуации, которые будут работать с объектами, рассматриваемыми в следующих лабораторных работах: EStrimError — произвольная ошибка при работе с потоками данных, EThread — ситуация борьбы за общий ресурс в программе с несколькими потоками событий, EDatabaseError — ошибка при работе с базами данных. Пример 1 Необходимо заполнить таблицу числа по следующему правилу: генерируется случайное число, а затем в ячейке компонента StringGrid 1 сохраняется обратное значение. Заранее не известно, был ли сгенерирован 0, и будет ли допустима операция деления. Для корректной работы данной программы необходимо задавать защищенный блок; процедура формирования таблицы будет иметь вид: procedure TForm1.Button1Click(Sender: TObject); var i,j:Integer; a:real; begin with StringGrid1 do begin ColCount:=SpinEdit1.Value+1; RowCount:=SpinEdit2.Value+1; for i :=1 to ColCount do for j:=1 to RowCount do Try {Начало блока} a:=Random(10); Cells[i,j]:=FloatToStr(1/a); except On EZeroDivide do ShowMessage('Деление на ноль в ячейке '+IntToStr(i)+’,’ +IntToStr(j)); {Проверка класса ошибки} end; end; end; Если необходимо использовать поля и методы класса-обработчика, то можно перед именем класса поставить идентификатор и двоеточие: On EObject:Expecrion do …………. Для стандартных классов такой прием позволяет использовать единственное строковое свойство Message, со стандартным сообщением об ошибке, которое получают все наследники класса Exception. В некоторых случаях бывает необходимо инициализировать исключительную ситуацию самостоятельно. Для этого используется зарезервированное слово raise (возбудить). Если этот оператор вставить в секцию Try … except или try … finally, то немедленно начнет работу секция обработки исключительной ситуации. Если данный оператор встретился в секции except … end или finally … end, то считается, что данный защищенный блок на текущем уровне вложенности завершил свою работу и управление В качестве примера рассмотрим программу, реализованную в лабораторной работе, посвященной графическим компонентам. В этой программе необходимо было ввести шестнадцатеричное число в компоненте Edit, перевести его в десятичное число и включить данный цвет. Функция, переводящая строку, которая является шестнадцатеричным числом, в десятичное число имеет вид: function HexStrToInt(s:string):integer; function hex(c:char):integer ; begin case c of '0'..'9':Result:=ord(c)-ord('0'); 'A'..'F':Result:=ord(c)-ord('A')+10; end; end; Var i:integer; begin result:=0; if s[1]='$' then delete(s,1,1); For i:=1 to length(s) do Result:=result*16+hex(s[i]); end; Функция hex на основании символа возвращает число. Если данный символ является цифрой или латинской буквой от A до F, то возвращаемое число будет истинно, однако если это не так, то результат будет просчитан неправильно. Следовательно, в операторе case необходимо учесть ветвь иначе, где должна вызываться исключительная ситуацию. Тогда функция hex будет иметь вид: function hex(c:char):integer ; begin case c of '0'..'9':Result:=ord(c)-ord('0'); 'A'..'F':Result:=ord(c)-ord('A')+10; else raise EConvertError.Creat (‘Недопустимое представление шестнадцатеричного числа ’); end; end; В данном примере оператор raise инициализирует событие EConvertError, которое возникает при ошибке комвертации и в качестве параметра передает необходимое сообщение. Задания: 1. Проверьте все программы из данной лабораторной работы. 2. Создайте текстовый редактор, который корректно работает при попытке открыть отсутствующий файл.
Популярное: Как вы ведете себя при стрессе?: Вы можете самостоятельно управлять стрессом! Каждый из нас имеет право и возможность уменьшить его воздействие на нас... Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (223)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |