
- •Система Pascal abc
- •Редактор
- •Горячие клавиши
- •Окно вывода
- •Окно ввода
- •Запуск и остановка программы
- •Программа прервана пользователем
- •Пошаговое выполнение программы
- •Окно отладки
- •Pascal abc Язык Pascal abc Структура программы
- •Идентификаторы и служебные слова
- •Выражения и операции
- •Арифметические операции
- •Операция @
- •Операции с указателями
- •Операции с множествами
- •Приоритет операций
- •Описание переменных и констант
- •Описание типов
- •Обзор типов
- •Все порядковые типы, а также типы boolean, real и complex называются простыми типами. Порядковые типы
- •Типы boolean, real и complex
- •Строковый тип
- •Массивы
- •Множества
- •Указатели
- •Процедурный тип
- •Эквивалентность типов
- •Неявное приведение типов
- •Явное приведение типов
- •Область действия идентификатора
- •Ввод и вывод. Форматы вывода
- •Оператор присваивания
- •Условный оператор
- •Составной и пустой операторы
- •Оператор выбора
- •Оператор цикла for
- •Оператор цикла repeat
- •Оператор вызова процедуры
- •Операторы break, continue и exit
- •Оператор with
- •Оператор безусловного перехода goto
- •Оператор try ... Except
- •Оператор try ... Finally
- •Оператор raise
- •Описание процедур и функций
- •Параметры процедур и функций
- •Локальные и глобальные переменные
- •Общие стандартные процедуры и функции
- •Стандартные процедуры и функции для работы со строками
- •Стандартные процедуры и функции для работы с файлами
- •Стандартные процедуры и функции для работы с памятью
- •Системные процедуры и функции
- •Стандартные константы
- •Обзор классов и объектов
- •Конструкторы и деструкторы
- •Свойства
- •Переменная Self
- •Наследование
- •Видимость членов класса
- •Переопределение методов
- •Приведение типов объектов
- •Операции is и as
- •Виртуальные методы и полиморфизм
- •Модуль crt
- •Модуль Timers
- •Модуль Sounds
- •Модуль Utils
- •Модуль PointRect
- •Модуль GraphAbc
- •Графические примитивы
- •Цветовые константы и функции для работы с цветом
- •Действия с пером
- •Действия с кистью
- •Действия со шрифтом
- •Действия с рисунками
- •Действия с графическим окном
- •Задание режимов вывода
- •Класс Picture
- •Описатели рисунков и класс Picture
- •Исполнитель Робот
- •Алгоритмизация
- •Алгоритм и его свойства
- •Способы описания алгоритмов
- •Линейные алгоритмы
- •Разветвляющиеся алгоритмы
- •Алгоритмы циклической структуры
- •Подчиненные алгоритмы
- •Системы программирования
- •Лабораторная работа № 1 Программирование линейных алгоритмов
- •Лабораторная работа № 2 Программирование разветвляющихся алгоритмов
- •Лабораторная работа № 4 Одномерные массивы - вектора
- •Литература Основная литература:
- •Дополнительная литература:
- •Лабораторная работа № 3 Программирование циклических алгоритмов
Оператор raise
Оператор raise предназначен для возбуждения исключения и имеет вид:
raise объект
Здесь объект - объект класса, производного от Exception. Например:
raise Exception.Create('Ошибка');
При возбуждении специфического исключения желательно определить свой тип исключения.
Обычно исключения возбуждаются в подпрограммах, поскольку разработчик подпрограммы, как правило, не знает, как обработать ошибочную ситуацию. В месте вызова подпрограммы уже, как правило, известно, каким образом следует обрабатывать исключение. Например, пусть разработана функция, вычисляющая котангенс:
function ctg(x: real): real; begin Result:=cos(x)/sin(x); end;
Если вызвать ctg(0), то будет возбуждено исключение EZeroDivide вещественного деления на 0.
Рассмотрим наивную попытку обработать ошибочную ситуацию внутри функции ctg:
function ctg(x: real): real; begin if x=0 then writeln('Функция ctg: деление на 0'); Result:=cos(x)/sin(x); end;
Подобное решение ужасно, поскольку программист, разрабатывающий функцию ctg, не знает, как она будет использоваться. Например, при вызове функции ctg в цикле мы увидим на экране многократное сообщение об ошибке.
Простейший способ - оставить исходный вариант функции и обрабатывать исключение EZeroDivide:
try readln(x); writeln(ctg(x)/(x-1)); ... except on EZeroDivide do writeln('Деление на 0'); end;
Отличие от вывода внутри функции состоит в том, что при разработке программы мы сами определяем действие, которое необходимо выполнять при обработке исключения. Это может быть специфическое сообщение об ошибке, вывод в файл ошибок или пустой оператор (в случае, когда требуется "беззвучно" погасить исключение).
Однако, последнее решение обладает существенным недостатком: исключение EZeroDivide будет возбуждено и при x=1 и не будет связано с функцией ctg. Для устранения подобного недостатка определим собственный класс исключения и возбудим его в функции ctg:
type ECtgError=class(Exception) end;
function ctg(x: real): real; begin if x=0 then raise ECtgError.Create('Функция ctg: деление на 0'); Result:=cos(x)/sin(x); end;
Тогда обработка ошибок будет выглядеть так:
try readln(x); writeln(ctg(x)/(x-1)); ... except on EZeroDivide do writeln('Деление на 0'); on e: ECtgError do writeln(e.Message); end;
Если сделать ECtgError наследником класса EMathError, как и EZeroDivide, то последний код можно упростить:
type ECtgError=class(EMathError) end;
...
try readln(x); writeln(ctg(x)/(x-1)); ... except on e: EMathError do writeln(e.Message); end;
Заметим, что если в блоке try произойдут другие исключения, то они не будут обработаны.
Наконец, исправим еще одну неточность. Исключение ECtgError должно генерироваться не только когда аргумент x равен 0, но и когда он кратен Pi. Чтобы не проверять это сложное условие, поступим следующим образом: перехватим в функции ctg исключение EZeroDivide и в ответ сгенерируем новое - ECtgError:
function ctg(x: real): real; begin try Result:=cos(x)/sin(x); except on e: EZeroDivide do raise ECtgError.Create('Функция ctg: деление на 0'); end; end;