Л.10. Обработка исключений.ppt
- Количество слайдов: 48
Обработка исключений в Delphi
Структурная обработка исключительных ситуаций - это система, позволяющая программисту при возникновении ошибки (исключительной ситуации) связаться с кодом программы, подготовленным для обработки такой ошибки. Выполняется с помощью языковых конструкций, которые как бы “охраняют” фрагмент кода программы и определяют обработчики ошибок, которые будут вызываться, если что-то пойдет не так в “охраняемом” участке кода.
Исключительные ситуации контролируются специальным обработчиком, который перехватывает практически все возникающие в программе ошибки. Он приостанавливает программу, не давая выполниться разрушительной команде, и сообщает об этом пользователю (окно ошибки) и программе, передавая информацию об обнаруженной ошибке в виде объекта. Существует специальная иерархия классов, описывающих исключительные ситуации. Класс Exception, объявленного в модуле Sys. Utils – базовый класс в этой иерархии.
Управление сообщениями ► Show. Message Delphi syntax: procedure Show. Message(const Msg: string); Пример: Show. Message (‘мое сообщение’);
Управление сообщениями ► Message. Box ► Message. Dlg
Генерация исключительной ситуации Классы иерархии Exception обладают несколькими видами конструкторов, которые можно применять для искусственной генерации соответствующей исключительной ситуации.
► Конструктор Create(const Msg: string); Параметр – строка, которая будет отображаться в диалоговом окне, информирующем о возникновении исключительной ситуации. procedure TForm 1. Button 1 Click(Sender: TObject); begin if strtoint(edit 1. Text)<1 then raise exception. Create(‘число <1’); end;
► Create. Res(Res. String. Rec: Pres. String. Rec); overload; Параметр – строка сообщения, которая загружается из ресурсов программы. procedure TForm 1. Button 1 Click(Sender: TObject); var s: string; begin s: ='1111'; if strtoint(edit 1. Text)<1 then raise exception. Create. Res(@s); end;
x: =10; y: =0; try z: =x div y; except on edivbyzero do raise edivbyzero. Create(‘делить на ноль нельзя'); end;
► Create. Fmt(const Msg: string; const Args: array of const); ► Create. Res. Fmt(Res. String. Rec: Pres. String. Rec; const Args: array of const); overload; Массив Args содержит значения, на основе которых с использованием строки форматирования Msg (см. функцию Format) или Res. String. Rec (загружается из ресурсов программы) формируется результирующее сообщение.
► Create. Help(Msg: string; AHelp. Context: integer); Идентификатор раздела справки AHelp. Context указывает, где пользователь сможет подробнее узнать о возникшей ошибке. Справочная система для текущей программы должна быть создана заранее.
Отключение сообщений отладчика: Tools – Debugger Options – вкладка Language Exceptions – выключить опцию Stop On Delphi Exceptions
Пример: Если в промежуточны Assign. File х операторах … (f, ’a. tmp’); возникнет Rewrite (f); исключение, то вычисления New (p); прервутся и … процедуры Erase (f); Erase и Dispose не будут Dispose (p); выполнены.
Некоторые классы исключений: EAbort «Молчаливое» исключение, предназначенное для намеренного прерывания вычислений и быстрого выхода из глубоко вложенных процедур и функций. Генерируется процедурой Abort. Диалоговое окно с сообщением об ошибке не показывается.
EArray. Error Использование ошибочного индекса элемента массива, добавление слишком большого числа элементов в массив фиксированной длины EConvert. Error Ошибка преобразования типов (Str. To. Int, Str. To. Float)
EIn. Out. Error Ошибка ввода- вывода из файла EDiv. By. Zero, Попытка EZero. Divide целочисленного деления на нуль. Деление на нуль числа с плавающей точкой
ERange. Error Значение выражения целого типа выходит за допустимый для этого типа диапазон. EInvalid. Argument Недопустимое значение параметра при обращении к математической функции
EFCreate. Error Ошибка создания файла EFOpen. Error Ошибка открытия файла
Контроль за исключительными ситуациями ►try. . except ►try. . finally Директива компилятора {R+ *. dfm}
Обработка исключений в блоках try…except
Синтаксис: try <исполняемый код - операторы> except <код, исполняемый в случае генерации исключения> else оператор; end;
В разделе except можно определить тип сгенерированного исключения и дифференцированно реагировать на различные исключительные ситуации. on <класс исключения> do <оператор>;
Операторы on…do позволяют проводить выборочную обработку различных исключений.
Var a: shortint; try c: =Str. To. Int(Edit 1. text); a: =b div c; except on EConvert. Error do Message. Dlg (‘вы ввели ошибочное число, повторите ввод’, mt. Warning, [mb. OK], 0); on EDiv. By. Zero do Message. Dlg (‘вы ввели ноль, повторите ввод’, mt. Warning, [mb. OK], 0); end;
Поиск класса подходящей исключительной ситуации осуществляется в последовательном порядке. Если возникшую ошибку можно отнести к нескольким классам, то вызван будет обработчик для класса, расположенного первым.
Пример: Try x: =y+z; Except on EInt. Error do P 1; on EInt. Overflow do P 2; End; {EInt. Error – базовый класс, на основе которого созданы классы ИС при работе с целыми числами EInt. Overflow – слишком большой результат при операции с целыми числами}
Можно создать единый обработчик для любой исключительной ситуации. Try Пример: <операторы; > Try Except x: =0; <действия; > Except End; Global. Proc; {процедура} End;
Иногда реализованной программистом обработки ошибки недостаточно. Тогда, указав ключевое слово raise без параметра, можно передать управление стандартному обработчику Delphi 7.
try except on … do begin ………. raise; end; except on … do … end;
С помощью ключевого слова raise можно сгенерировать исключение любого типа в любом месте программы raise <исключение>; Вместо исключения можно указать тип исключения и один из его конструкторов.
Пример: try y: =strtoint(edit 1. Text); x: =100 div y; except on EZero. Divide do begin Show. Message(‘ошибка'); raise; end;
Использование конструкторов raise <тип исключения>. create (<текст сообщения>); Пример: if Edit 1. Text=’’ then raise Ezero. Divide. Create (‘Не задана требуемая информация’);
Выполнение завершающих действий в блоках try…finally
Иногда программисту не нужен собственный обработчик ошибок, но требуется чтобы программа гарантированно выполнила определенные действия, связанные например, с освобождением ресурсов.
try <операторы, способные привести к исключению> finally <операторы, выполняемые в любом случае (заключительные действия)> end;
Пример 1: Var Dyn. Arr: array of integer; … Try Set. Length(Dyn. Arr, 100000); … Finally Dynarr: =nil; End;
Пример 2: Assign. File (f, ’a. tmp’); Rewrite (f); New (p); try … finally Erase (f); Dispose (p); … end;
Передача объектов, связанных с исключительными ситуациями
При возникновении исключительной ситуации в программе создается объект ее обработки. Для получения доступа к объекту обработки исключительной ситуации в описании класса Except нужно предварительно указать произвольный идентификатор: on E: EInt. Error do P;
Переменная Е ранее не описывается и к ней можно обращаться, например, для занесения новых значений в ее свойства.
Свойства класса исключительной ситуации ► Message, в котором хранится строка, выводимая в окне сообщения ► Help. Context, число-идентификатор раздела справочной системы для вывода более подробной информации об ошибке
Пример: on E: EInt. Error do begin E. Message: =‘Ошибка выполнения’; raise; end;
Если доступ к объекту, описывающему ошибку, надо получить в части else блока except, где никакие классы явно не упоминаются, можно использовать функцию Except. Object, которая возвращает такой объект.
Создание своего типа исключения
Type <имя класса исключения> = Class (Exception); Например: Type ENo. Inf = class (Exception);
При необходимости можно генерировать сообщение: raise ENo. Inf. Create (‘Не задана информация’); или on ENo. Inf do Message. Dlg (‘Укажите цену товара’, mt. Warning, [mb. OK], 0);
Л.10. Обработка исключений.ppt