Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
Класс |
Родительский |
Описание |
исключения |
класс |
|
EAccessViolation |
Exception |
Программа пыталась обратиться к не |
|
|
принадлежащей ей области памяти или использует |
|
|
недействительный указатель. |
EControlC |
Exception |
Возникает при нажатии Ctrl-C при работе |
|
|
приложения в режиме консоли. |
EConvertError |
Exception |
Ошибка преобразования в функциях StrToInt или |
|
|
StrToFloat. |
EDivByZero |
EIntError |
Ошибка целочисленного деления на ноль |
EFCreateError |
EStreamError |
Ошибка при создании файла. Например, попытка |
|
|
создать файл на устройстве, предназначенном |
|
|
только для чтения, или в несуществующем каталоге. |
EFOpenError |
EStream-Erro |
Ошибка открытия потока данных. Например, |
|
|
попытка открыть несуществующий файл. |
EInOutError |
Exception |
Любая ошибка в файловых операциях. Поле |
|
|
ErrorCode объекта этого класса содержит код |
|
|
ошибки. |
EIntError |
Exception |
Любая ошибка в целочисленных вычислениях. |
EInvalidCast |
Exception |
Программа пытается осуществить недопустимое |
|
|
преобразование типов с помощью оператора as. |
EInvalidOp |
EMatchError |
Ошибка в операциях с плавающей точкой |
|
|
(недопустимая инструкция, переполнение стека |
|
|
сопроцессора и т.п.). |
EMatchError |
Exception |
Любая ошибка при выполнении вычислений с |
|
|
плавающей точкой. |
EOutOfMemory |
Exception |
Эта ошибка возникает, когда программа |
|
|
запрашивает слишком большой для данной |
|
|
конфигурации Windows объем памяти. |
EOverflow |
EMatchError |
Результат операций с плавающей точкой слишком |
|
|
велик, чтобы уместиться в регистрах сопроцессора. |
EWriteError |
EFilerError |
Ошибка записи в поток данных. |
EZeroDivide |
EMatchError |
Вещественное деление на ноль. |
|
|
|
Обратите внимание, что ищется самый первый из, возможно, нескольких обработчиков, класс которого способен обрабатывать данное исключение. Если,
например, в списке первым стоит EAbort, который может обработать любое исключение, ни один из стоящих за ним обработчиков никогда не получит управления. Точно так же, если указан обработчик для класса EIntError, за ним бесполезно размещать обработчики
EDivByZero, ERangeError или EIntOverflow:
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
При возникновении исключительной ситуации объекты классов-обработчиков создаются и уничтожаются автоматически, т.е. являются объектами с управляемым временем жизни. Если необходимо использовать поля или методы класса-обработчика явно, необходимо поименовать автоматически создаваемый объект. Для этого перед именем класса ставится идентификатор и двоеточие:
try
...
except
...
on E: EClassName do ; writeln(E.Message);
...
end;
Для стандартных классов такой прием фактически позволяет использовать единственное строковое свойство Message со стандартным сообщением об ошибке, которое получают все наследники класса Exception.
Можно создать собственный класс обработки исключений, объявив его потомком Exception или любого другого стандартного класса. Объявление нестандартного класса имеет смысл только тогда, когда необходимо научить программу распознавать некорректные наборы данных и соответствующим образом на них реагировать. Например
type EMyError=class(Exception);
Совет: В Delphi принято для имен классов исключений использовать префикс «E». Рекомендуется при создании собственных классов исключений руководствоваться этим же принципом. Примеры имен классов исключений можно посмотреть в таблице 1.
Ниже приведен пример программы использующей пользовательский обработчик исключительной ситуации. Программа обрабатывает две исключительные ситуации неверный формат числа (EInOutError) и выражение под квадратным корнем меньше нуля
(EMyError).
Листинг 3
program Myexp;
{$APPTYPE CONSOLE}
uses SysUtils;
// класс исключения
type EMyError=class(Exception);
function Calculate(X:real):real; begin
if 1-x*x<0 then raise EMyError.Create('Demo MyError'); result:=sqrt(1-x*x);
end;
var value:real; begin
try
write('value > '); readln(value);
writeln('result=', Calculate(Value));
Лабораторные работы по информатике для специальности «Моделирование и исследование операций в организационно-технических системах»
except
on Err:EMyError do writeln('Error: ', Err.message); on Err:EInOutError do writeln('Error: ', Err.message);
else
writeln('Unknown Error'); end;
writeln('Press Enter to Exit'); readln;
end.
Задания к лабораторной работе
1.Модифицируйте программы из заданий 2-5 лабораторной работы № 6, добавив проверку на ошибки ввода-вывода с помощью защищенных блоков?
2.Модифицируйте программу из листинга 12 лабораторной работы № 11, добавив проверку на ошибки ввода-вывода с помощью защищенных блоков?
3.Модифицируйте функцию SearchNode из модуля Lists (лабораторная работа № 10) таким образом, чтобы при отрицательном результате поиска ( т.е. заданный элемент в списке не найден) возникала исключительная ситуация ENotFoundError. Модифицируйте также программу из листинга 1 (лабораторная работа № 10) так, чтобы она могла обрабатывать исключительную ситуацию ENotFoundError, а также исключительные ситуации связанные с ошибками ввода-вывода.
Вопросы к лабораторной работе
1.В чем суть механизма обработки исключительных ситуаций?
2.Что такое защищенный блок?
3.Как работает защищенный блок завершения?
4.Как работает защищенный блок исключения?
5.Как программно возбудить исключение?
6.Какие стандартные классы исключений вы знаете?
7.Как создать свой класс исключение?
8.Какой особенностью работы с памятью обладают классы исключений?
9.Как получить доступ к полям и методам класса исключения во время обработки ошибки в секции except end?
10.Какой алгоритм используется при выборе исключения в секции except end?
Справочные таблицы |
|
Таблица 1– Стандартные классы исключений........................................................................... |
5 |