|
Обработка исключительных ситуаций в Delphi.Цель работы: изучение основных способов обработки исключительных ситуаций в Delphi, приобретение практических навыков при использовании основных блоков защиты кода try…except… и try…finally… Краткие теоретические сведения. Всякое взаимодействие с операционной системой на предмет получения ресурсов — места на диске, в памяти, открытие файла — может завершиться неудачно. Любое вычисление может закончиться делением на ноль или переполнением. При возникновении исключительных ситуаций (ИС) программа генерирует исключение и выполнение дальнейших действий в данном блоке прекращается. Платой за надежную работу программы в таких условиях служит введение многочисленных проверок, способных предотвратить некорректные действия в случае возникновения нештатной ситуации. При разработке приложений в Delphi есть возможность использовать несколько механизмов, обеспечивающих обработку исключительных ситуаций. Это и классы, предназначенные для программирования реакции на ошибки, и специальные операторы языка Object Pascal. В Delphi есть иерархия классов во главе с базовым классом Exception, которые предназначены для обработки исключительных ситуаций. В таблицах 1 и 2 приведены некоторые такие классы. Таблица 1. ИС целочисленной математики (порождены отEIntError)
Таблица 2. ИС математики с плавающей точкой (порождены от EMathError)
Защитные конструкции языка Object Pascal Для работы с объектами исключительных ситуаций существуют специальные конструкции языка Object Pascal— блоки try…except и try…finally. Они контролируют выполнение операторов, помещенных внутри блока до ключевого слова except или finally. В случае возникновения исключительной ситуации штатное выполнение вашей программы немедленно прекращается, и управление передается операторам, идущим за указанными ключевыми словами. Если в вашей процедуре эти блоки отсутствуют, управление все равно будет передано ближайшему блоку, внутри которого возникла ситуация. Блок try..except Для реакции на конкретный тип ситуации применяется блок try..except. Синтаксис его следующий: try <Операторы> except on EExceptionl do < Оператор обработки ИС типа EExceptionl >; on EException2 do <Оператор обработки ИС типа Eexception2 >; ... else <Оператор> //обработчик прочих ИС end; Выполнение блока начинается с секции try. При отсутствии исключительных ситуаций только она и выполняется. Секция except получает управление в случае возникновения ИС. После обработки происходит выход из защищенного блока, и управление обратно в секцию try не передается; выполняются операторы, стоящие после end. Если вы хотите обработать любую ИС одинаково, независимо от ее класса, вы можете писать код прямо между операторами except и end. Но если обработка отличается, здесь можно применять набор директив on...do, определяющих реакцию приложения на определенную ситуацию. Каждая директива связывает ситуацию (on...), заданную своим именем класса, с группой операторов (do...). Иногда замена if...then на try...except не приводит к экономии кода. Однако если при решении вычислительной задачи проверять на возможное появление ИС приходится не один, а множество раз, то выигрыш неоспорим — достаточно одного блока try...except на все вычисления. При возникновении ИС директивы просматриваются последовательно, в порядке их описания. Каждый тип исключительной ситуации, описанный после ключевого слова on, обрабатывается именно этим блоком: только то, что предусмотрено в нем, и будет являться реакцией на данную ситуацию. Если возникла ситуация, не определенная ни в одной из директив, выполняются те операторы, которые стоят после else. Если и их нет, то ИС считается не обработанной и будет передана на следующий уровень обработки. Этим следующим уровнем может быть другой оператор try...except, который содержит в себе данный блок. Блок try...finally Параллельно с блоком try...except в языке существует и try...finally. Он соответствует случаю, когда необходимо возвратить выделенные программе ресурсы даже в случае аварийной ситуации. Синтаксис блока try...finally таков: try <Операторы>{Операторы, способные привести к ИС} finally <Операторы> {Операторы, выполняемые в любом случае} end; Следующие за try операторы исполняются в обычном порядке. Если за это время не возникло никаких ИС, далее следуют те операторы, которые стоят после finally. В случае если между try и finally произошла ИС, управление немедленно передается операторам части finally…end. Таким образом, операторы, стоящие после finally, выполняются всегда. Блок try...finally еще называется блоком защиты ресурсов. Данная конструкция ничего не делает с самим объектом — исключительной ситуацией. Задача try...finally — только прореагировать на факт нештатного поведения программы и проделать определенные действия. Сама же ИС остается необработанной. Блоки защиты ресурсов и обработчики ИС, как и другие блоки, могут быть вложенными: try try … finally … end; except … end; Вызов исключения В некоторых случаях бывает необходимо инициировать собственное исключение. Для этого используется зарезервированное слово raise (возбудить). Если это слово встретилось в секции try...except или try...finally, немедленно начинают свою работу секции except... end и finally... end соответственно. Слово raise возбуждает исключение самого общего класса Exception. Если программист желает возбудить исключение конкретного типа (не важно - стандартного или собственного), он должен явно указать класс создаваемого в этот момент объекта путем вызова его конструктора. Например, следующий оператор возбудит ошибку ввода/вывода: raise EInOutError.Create('Ощибка!'); Такой прем - единственная возможность возбудить нестандартное исключение. Вывод сообщений Для вывода окна с сообщением предусмотрено несколько функций. 1. MessageDlg(const Msg: string; AType: TMsgDlgType;AButtons: TMsgDlgType; HelpCtx: Longint):Word; Отображает окно с сообщением Msg, с пиктограммой, задаваемой параметром AType, с набором кнопок, задаваемым параметром AButtons, и с темой справки, задаваемой параметром HelpCtx. Возвращает результат, указывающий, какую кнопку в диалоговом окне нажал пользователь. 2. MessageDlgPos(const Msg: string; AType: TMsgDlgType; Buttons: TMsgDlgType; HelpCtx: Longint; X,Y: integer):Word; Отображает окно с сообщением Msg, с пиктограммой, задаваемой параметром AType, с набором кнопок, задаваемым параметром AButtons, и с темой справки, задаваемой параметром HelpCtx. Параметры X и Y задают экранные координаты верхнего левого угла окна. Возвращает результат, указывающий, какую кнопку в диалоговом окне нажал пользователь. 3. ShowMessage(const Msg: string); Отображает окно с сообщением Msg, с кнопкой OK.
Пример создания приложения с обработкой ИС. Задание. Создать Windows-приложение для отображения матрицы. Матрица должна загружаться из файла, выбранного с помощью компонента OpenDialog. Для выполнения этого задания на форме необходимо разместить следующие компоненты: 1. Страница 2. Страница 3. Страница Один из возможных вариантов панели интерфейса создаваемого приложения показан на рис.1. При работе с массивами ввод и вывод информации на экран удобно организовывать с помощью компонента StringGrid. Компонент StringGrid используется для отображения информации в виде таблицы. Пиктограмма
![]() ![]() ![]() Рис.1. Количество строк и столбцов фиксированной зоны устанавливается в свойствах FixedRows и FixedCols соответственно. Рабочая зона содержит RowCount строк и ColCount столбцов информации, которую можно изменять как программно, так и с помощью “мыши” или клавиатуры. Доступ к содержимому ячеек в программе осуществляется с помощью свойства Cells[ACol, ARow: integer]: string, где ACol-номер столбца, а ARow – номер строки таблицы, причем нумерация начинается с нуля. По умолчанию в компонент StringGrid запрещен ввод информации с клавиатуры, для разрешения ввода информации в ячейки необходимо в Инспекторе Объектов дважды щелкнуть “мышью” на символе + свойства +Options и в открывшемся списке опций установить значение goEditing в True. Так как в нашем задании фиксированная зона не используется, то в Инспекторе Объектов значения свойств FixedCols и FixedRows можно установить равными 0. Организуем файл таким образом, чтобы в первой строке находилось количество строк матрицы, во второй – количество столбцов, а каждый элемент матрицы - в отдельной строке. Тогда, прочитав первые 2 цифры, можно установить значения свойств RowCount и ColCount компонента StringGrid. Так как при работе с файлами могут возникать ошибки ввода-вывода, то необходимо использовать защитные конструкции try..except и try..finally. В общем случае метод-обработчик события onClick для компонента Button будет выглядеть следующим образом: procedure TForm1.LoadClick(Sender: TObject); var f1:textfile; c,r,i,j,k:integer; begin if opendialog1.Execute then if FileExists(OpenDialog1.FileName) then begin assignfile(f1,opendialog1.FileName); try try reset(f1); // здесь возможна ошибка EInOutError readln(f1,c); // здесь возможна ошибка EInOutError readln(f1,r); // здесь возможна ошибка EInOutError stringgrid1.ColCount:=c; stringgrid1.rowCount:=r; for i:=0 to r-1 do for j:=0 to c-1 do begin readln(f1,k); // здесь возможна ошибка EInOutError stringgrid1.Cells[j,i]:=inttostr(k);// здесь возможна ошибка EConvertError end; finally closefile(f1); end; except on E:EInOutError do showmessage('Ошибка при работе с файлом: '+inttostr(E.Errorcode)); on EConvertError do showmessage('Ошибка преобразования типов'); end; end else showmessage('Файл не найден'); end; Содержание отчета. Содержание отчета должно включать следующие пункты: цель работы, номер варианта и задание, полный текст модуля, результат работы приложения (внешний вид окон). Контрольные вопросы. 1. Обработка исключительных ситуаций в Delphi: блок try …except. 2. Обработка исключительных ситуаций в Delphi: блок try.. finally. 3. Обработка исключительных ситуаций в Delphi: вызов исключений (raise). 4. Компоненты StringGrid, SpinEdit: назначение, основные свойства.
Лабораторное задание. Выполнить задание необходимо в соответствии с вариантом. Каждое задание предусматривает работу с одномерными массивами и матрицами. Исходные массивы должны вводиться из файла при нажатии на кнопку «Загрузить». Выбор файла реализовать с помощью компонента OpenDialog. На форме предусмотреть кнопку «Сохранить», при нажатии на которую результат сохраняется в файле. Программа должна обрабатывать все исключительные ситуации, которые могут возникнуть при вводе матрицы, формировании массивов и т. д. В случае возникновения ошибки должно выводиться окно с соответствующим сообщением. Номер строки или столбца массивов можно указывать в компоненте SpinEdit. Компонент SpinEdit находится на странице Samples Палитры Компонентов. Доступ к содержимому внутри окна компонента можно получить, используя свойство Text. Варианты. 1. Создать приложения для вычисления и отображения 2-х одномерных массивов B и С. Элементы массивов должны быть получены из исходной целочисленной матрицы А в результате вычисления формул: ln(a[р,j]) (для массива В) и 1/ln(a[р,j]) (для массива С). Организовать выбор номера строки р матрицы А. Массивы должны формироваться при нажатии на кнопку «Пуск». 2. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[i,p]/cos(b[i]). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск». 3. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[р,j]/cos(b[j]). Организовать выбор номера строки р матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск». 4. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления b[i]/sin(а[i,р])). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск». 5. Задана целочисленная матрица А размером NxM. Сформировать вектор В, элементы которого равны tg(a[i,р]). Организовать выбор номера столбца p матрицы А. Вектор В должен формироваться при нажатии на кнопку «Пуск». 6. Заданы вектора В и С размером N. Сформировать вектор А размером N, элементы которого равны целой части частного от деления с[i]/cos(b[i]). Вектор А должен формироваться при нажатии на кнопку «Пуск». 7. Создать приложения для вычисления и отображения 2-х одномерных массивов B и С. Элементы массивов должны быть получены из исходной целочисленной матрицы А в результате вычисления формул: a[р,j]/ a[р-1,j] (для массива В) и a[р,j]/ a[р+1,j] (для массива С). Организовать выбор номера строки р матрицы А. В случае выбора в качестве р номера первой или последней строки организовать замену на номер последней или первой строки соответственно. Массивы должны формироваться при нажатии на кнопку «Пуск». 8. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[р,j]/sin(b[j]). Организовать выбор номера строки р матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск». 9. Задана целочисленная матрица А размером NxM. Сформировать вектор В, элементы которого равны sin(a[i,р])/a[i,р]. Организовать выбор номера столбца p матрицы А. Вектор В должен формироваться при нажатии на кнопку «Пуск». 10. Заданы: целочисленная матрица А размером NxM и вектор В. Сформировать вектор С, элементы которого равны целой части частного от деления а[i,p]/sin(b[i]). Организовать выбор номера столбца p матрицы А. Вектор С должен формироваться при нажатии на кнопку «Пуск». Лабораторная работа №4. ![]() ![]() Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом... ![]() Что способствует осуществлению желаний? Стопроцентная, непоколебимая уверенность в своем... ![]() Что делает отдел по эксплуатации и сопровождению ИС? Отвечает за сохранность данных (расписания копирования, копирование и пр.)... ![]() ЧТО И КАК ПИСАЛИ О МОДЕ В ЖУРНАЛАХ НАЧАЛА XX ВЕКА Первый номер журнала «Аполлон» за 1909 г. начинался, по сути, с программного заявления редакции журнала... Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:
|