Методические рекомендации
Стр 1 из 2Следующая ⇒ Лабораторная работа №2
Тема работы: Обработка исключений Цель работы: Изучить свойства и методы класса Exception, научиться использовать конструкции try … finally и try … except при локальной обработки исключений.
Ход работы: Изучить методические рекомендации к лабораторной работе. 2. Составить программу чтения данных из файла. Программа должна осуществлять глобальную обработку исключений. 3. Составить программу деления вещественных чисел. Программа должна выполнять обработку исключений c использованием конструкции try … finally или try … except, и выдавать следующие сообщения о характере ошибки: Не введено число Введено слишком длинное число Деление на ноль Ошибка преобразования Ошибка не идентифицирована 4. Составить программу, в которой при нажатии кнопки в форме отображается изображение из файла. Программа должна выполнять обработку исключений c использованием конструкции try … finally или try … except, и выдавать следующие сообщения о характере ошибки: Ошибка открытия файла Ошибка чтения файла Ошибка графики Неправильный графический формат Ошибка не идентифицирована 5. Составьте программу, выполняющую произвольные действия. Программа должна выполнять обработку исключений с использованием вложенных конструкций try … finally и try … except. 6. Оформить отчет, который должен содержать следующее:
Содержание отчета:
1. Тема, цель, ход работы; 2. Листинг программ; 3. Результат работы программ (основная форма программы и все диалоговые окна с сообщениями об ошибках); 4. Вывод.
Контрольные вопросы: 1. Виды ошибок, их характеристика; 2. Как осуществляется отладочное выполнение программы;
3. Виды исключений; 4. Обработка исключений. Глобальная и локальная обработка, их отличительные особенности.
Методические рекомендации
Исключения связаны с возникновением ошибок в процессе выполнения приложений. В этой главе рассматриваются способы обработки исключений. Виды ошибок В процессе разработки и выполнения программы возникают ошибки: синтаксические; логические; динамические. Синтаксические ошибки вызываются нарушением синтаксиса языка, они выявляются и устраняются при компиляции программы. Их обнаруживает компилятор, выдавая сообщения и указывая в тексте программы место, где возникла ошибка. Например, в условной инструкции If length(edit1.text) = 0 then edit1.text = ‘Нет имени’; допущена ошибка — в записи операции присваивания отсутствует знак двоеточия (:). При ее обнаружении в ходе компиляции будет выдано соответствующее сообщение (рис.1).
Рисунок 1 – Сообщение о синтаксической ошибке
Логические ошибки являются следствием реализации неправильного алгоритма и проявляются при выполнении программы. Их наличие обычно не приводит к выдаче сообщений или прекращению работы всего приложения, однако программа будет работать некорректно и выдавать неправильные, результаты. Фрагмент программы, в котором вычисляется сумма элементов массива MAS: Sum:= 1; For i:=1 to 50 do sum:=sum+MAS[i]; перед началом суммирования значение суммы должно обнуляться, однако в программе допущена ошибка: вместо нуля переменной sum присваивается начальное значение, равное единице. Такая ошибка не приведет к прекращению выполнения программы, однако получаемый при суммировании результат будет неверен. Динамические ошибки возникают при выполнении программы и являются следствием неправильной работы инструкций, процедур, функций или методов программы, а также операционной системы. Динамические ошибки называют также ошибками времени выполнения (Runtime errors). Например, в инструкции присваивания
I:= count/number во время выполнения программы возможно появление ошибки, если переменная number будет иметь нулевое значение. При отладке программ с целью выявления динамических ошибок удобно задавать отладочное (пошаговое или трассировочное) выполнение программы с использованием окон просмотра (Watch list). В окне просмотра можно указать выражения, имена переменных или свойств объекта, изменение значений которых требуется проконтролировать. Для отладочного выполнения программы с помощью меню Run (Выполнение) можно использовать следующие варианты: команда Step Over (Шаг с обходом) предписывает выполнение одной строки кода программы с обходом процедур (процедура выполняется как единый модуль); команда Trace Into (Трассирование до) предписывает выполнение одной строки кода программы с заходом в процедуры и их последующим построчным выполнением; команда Trace to next source line (Трассирование до следующей строки кода) предписывает выполнение программы с остановкой на следующей выполнимой строке кода программы; команда Run to cursor (Выполнение до курсора) задает выполнение загруженной программы до места размещения курсора в Редакторе кода; команда Run until Return (Выполнение до возврата) задает выполнение программы до момента возврата из текущей процедуры. Для добавления очередного контролируемого выражения в окно просмотра служит команда Run/Add Watch. После ее выполнения открывается диалоговое, Watch Properties (Свойства просмотра) для задания свойств контролируемого выражения. В поле Expression (Выражение) задается выражение для контроля его значения, в поле Group name (Имя группы) можно задать имя группы, в которую будет помещено контролируемое выражение. С помощью группы переключателей в нижней части диалогового окна выбирается формат отображения значения контролируемого выражения. Для обработки динамических ошибок введено понятие исключения, которое представляет собой нарушение условий выполнения программы, вызывающее прерывание или полное прекращение ее работы. Обработка исключения состоит в нейтрализации вызвавшей его динамической ошибки. Исключения могут возникать по различным причинам, например, в случае нехватки памяти, из-за ошибки преобразования, в результате выполнения вычислений и т. д. В любом случае независимо от источника ошибки приложение информируется (получает сообщение) о его возникновении. Исключение остается актуальным до тех пор, пока не будет обработано глобальным обработчиком или локальными процедурами.
Классы исключений Исключения в Delphi являются объектами. Базовым классом для всех исключений служит класс Exception, описываемый в модуле SysUtils. Потомки этого класса содержат большое количество исключений, которые могут возникнуть в процессе выполнения приложения. Виды исключений: · EAbort - “скрытое” исключение. Используйте его тогда, когда хотите прервать тот или иной процесс с условием, что пользователь программы не должен видеть сообщения об ошибке. Для повышения удобства использования в модуле SysUtils предусмотрена процедура Abort, определенная, как: procedure Abort;beginraise EAbort.CreateRes(SOperationAborted) at ReturnAddr;end;· EComponentError - вызывается в двух ситуациях: 1) при попытке регистрации компоненты за пределами процедуры Register; 2) когда имя компоненты не уникально или не допустимо. · EConvertError - происходит в случае возникновения ошибки при выполнении функций StrToInt и StrToFloat, когда конвертация строки в соответствующий числовой тип невозможна. · EInOutError - происходит при ошибках ввода/вывода при включенной директиве {$I+}. · EIntError - предок исключений, случающихся при выполнении целочисленных операций. · EDivByZero - вызывается в случае деления на ноль, как результат RunTime Error 200. · EIntOverflow - вызывается при попытке выполнения операций, приводящих к переполнению целых переменных, как результат RunTime Error 215 при включенной директиве {$Q+}. · ERangeError - вызывается при попытке обращения к элементам массива по индексу, выходящему за пределы массива, как результат RunTime Error 201 при включенной директиве {$R+}. · EInvalidCast - происходит при попытке приведения переменных одного класса к другому классу, несовместимому с первым (например, приведение переменной типа TListBox к TMemo).
· EInvalidGraphic - вызывается при попытке передачи в LoadFromFile файла, несовместимого графического формата. · EInvalidGraphicOperation - вызывается при попытке выполнения операций, неприменимых для данного графического формата (например, Resize для TIcon). · EInvalidObject - реально нигде не используется, объявлен в Controls.pas. · EInvalidOperation - вызывается при попытке отображения или обращения по Windows-обработчику (handle) контрольного элемента, не имеющего владельца (например, сразу после вызова MyControl:=TListBox.Create(...) происходит обращение к методу Refresh). · EInvalidPointer - происходит при попытке освобождения уже освобожденного или еще неинициализированного указателя, при вызове Dispose(), FreeMem() или деструктора класса. · EListError - вызывается при обращении к элементу наследника TList по индексу, выходящему за пределы допустимых значений (например, объект TStringList содержит только 10 строк, а происходит обращение к одиннадцатому). · EMathError - предок исключений, случающихся при выполнении операций с плавающей точкой. · EInvalidOp - происходит, когда математическому сопроцессору передается ошибочная инструкция. Такое исключение не будет до конца обработано, пока Вы контролируете сопроцессор напрямую из ассемблерного кода. · EOverflow - происходит как результат переполнения операций с плавающей точкой при слишком больших величинах. Соответствует RunTime Error 205. · Underflow - происходит как результат переполнения операций с плавающей точкой при слишком малых величинах. Соответствует RunTime Error 206. · EZeroDivide - вызывается в результате деления на ноль. · EMenuError - вызывается в случае любых ошибок при работе с пунктами меню для компонент TMenu, TMenuItem, TPopupMenu и их наследников. · EOutlineError - вызывается в случае любых ошибок при работе с TOutLine и любыми его наследниками. · EOutOfMemory - происходит в случае вызовов New(), GetMem() или конструкторов классов при невозможности распределения памяти. Соответствует RunTime Error 203. · EOutOfResources - происходит в том случае, когда невозможно выполнение запроса на выделение или заполнение тех или иных Windows ресурсов (например таких, как обработчики - handles). · EParserError - вызывается когда Delphi не может произвести разбор и перевод текста описания формы в двоичный вид (часто происходит в случае исправления текста описания формы вручную в IDE Delphi). · EPrinter - вызывается в случае любых ошибок при работе с принтером. · EProcessorException - предок исключений, вызываемых в случае прерывания процессора- hardware breakpoint. Никогда не включается в DLL, может обрабатываться только в “цельном” приложении. · EBreakpoint - вызывается в случае останова на точке прерывания при отладке в IDE Delphi. Среда Delphi обрабатывает это исключение самостоятельно.
· EFault - предок исключений, вызываемых в случае невозможности обработки процессором тех или иных операций. · EGPFault - вызывается, когда происходит “общее нарушение защиты” - General Protection Fault. Соответствует RunTime Error 216. · EInvalidOpCode - вызывается, когда процессор пытается выполнить недопустимые инструкции. · EPageFault - обычно происходит как результат ошибки менеджера памяти Windows, вследствие некоторых ошибок в коде Вашего приложения. После такого исключения рекомендуется перезапустить Windows. · EStackFault - происходит при ошибках работы со стеком, часто вследствие некорректных попыток доступа к стеку из фрагментов кода на ассемблере. Компиляция Ваших программ со включенной проверкой работы со стеком {$S+} помогает отследить такого рода ошибки. · ESingleStep - аналогично EBreakpoint, это исключение происходит при пошаговом выполнении приложения в IDE Delphi, которая сама его и обрабатывает. · EPropertyError - вызывается в случае ошибок в редакторах свойств, встраиваемых в IDE Delphi. Имеет большое значение для написания надежных property editors. Определен в модуле DsgnIntf.pas. · EResNotFound - происходит в случае тех или иных проблем, имеющих место при попытке загрузки ресурсов форм - файлов.DFM в режиме дизайнера. Часто причиной таких исключений бывает нарушение соответствия между определением класса формы и ее описанием на уровне ресурса (например,вследствие изменения порядка следования полей-ссылок на компоненты, вставленные в форму в режиме дизайнера). · EStreamError - предок исключений, вызываемых при работе с потоками. · EFCreateError - происходит в случае ошибок создания потока (например, при некорректном задании файла потока). · EFilerError - вызывается при попытке вторичной регистрации уже зарегистрированного класса (компоненты). Является, также, предком специализированных обработчиков исключений, возникающих при работе с классами компонент. · EClassNotFound - обычно происходит, когда в описании класса формы удалено поле-ссылка на компоненту, вставленную в форму в режиме дизайнера. Вызывается, в отличие от EResNotFound, в RunTime. · EInvalidImage - вызывается при попытке чтения файла, не являющегося ресурсом, или разрушенного файла ресурса, специализированными функциями чтения ресурсов (например, функцией ReadComponent). · EMethodNotFound - аналогично EClassNotFound, только при несоответствии методов, связанных с теми или иными обработчиками событий. · EReadError - происходит в том случае, когда невозможно прочитать значение свойства или другого набора байт из потока (в том числе ресурса). · EFOpenError - вызывается когда тот или иной специфированный поток не может быть открыт (например, когда поток не существует). · EStringListError - происходит при ошибках работы с объектом TStringList (кроме ошибок, обрабатываемых TListError).
Читайте также: Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|