Классы исключений определены в модулях Classes и SysUtils. Используются для обработки исключительных ситуаций, возникающих при исполнении программы. Например, попытка открыть файл, которого нет.
Базовый класс исключений – Exception. Его потомки – классы исключений, имена которых начинаются с символа E, за которым следует описание исключения на английском языке.
В модуле SusUtils опредлено много исключений. Вот примеры:
- EIntError – ошибка операции с целыми числами.
- EZeroDivide – деление на ноль.
- ERangeError – ошибка диапазона.
- EIntOverflow – ошибка переполнения.
- EMathError – математическая ошибка.
Для обработки исключений предусмотрены три инструкции:
- инструкции Raise,
- блоки try…except,
- блоки try…finally.
Внимание . Эти инструкции доступны в режимах Delphi и ObjPas. В режиме Turbo Pascal они невозможны.
Инструкция Raise
Инструкция Raise запускает исключение, которое предварительно должно быть определено, как экземпляр класса исключений. Формат инструкции:
Установка среды программирования PascalABC.NET
При возникновении объявленного исключения инициализируется экземпляр класса этого исключения. Пример обработки деления на ноль, когда этому исключению дано уникальное имя:
Type EDivException = Class(Exception);
Function DoDiv (X,Y : Longint) : Integer;
Raise EDivException.Create (’Division by Zero would occur’);
Result := X Div Y;
Инструкция try…except
- Выполняется секция try.
- Если исключение не возникает, то инструкция завершается.
- Если исключение возникает, то секция try завершается и выполняется обработчик возникшего исключения из секции except.
Формат обработчика исключений в секции except
do < Инструкция >; // Любая инструкция, кроме goto
Пример обработки деления на ноль (использованы средства из предыдущего примера):
On EDivException do Z := 0;
Инструкция try…finally
В ней при возникновении исключения секция try завершается, исключение специально не обрабатывается, но всегда исполняется секция finally. Формат инструкции:
- Выполняется группа try.
- Если исключение возникло, то все инструкции, следующие после инструкции, вызвавшей исключение, пропускаются, и управление передается первой инструкция секции finally.
Если исключений не возникло, то секция finally все равно выполняется.
Источник: pascal-cod.ru
Проблема с вводом (Паскаль)
Здравствуйте. У меня возникла проблема с чтением данных с клавиатуры.
Проблема неработающего readln(x), возникает если вызвать процедуру LoadLibrary из модуля (readln вызываю из самой программы).
Вот функция:
procedure LoadLibrary(var lib: tLibrary; filename: string);
var libfile: text;
Здесь я открываю файл, задаю его для чтения, читаю до конца и закрываю.
Паскаль с нуля [ч4]. Условные операторы
Процедура работает нормально: с диска данные читает.
После этого чтение с клавиатуры перестает работать.
Пробовал переназначить клаву на новую файловую переменную
assign(f,»);
reset(f);
readln(f,x) — все равно не работает.
Если функцию LoadLibrary не вызывать readln работает. По-моему, все сводится к тому что прога не может зацепиться к клаве
и пытается читать данные из файла который я уже дочитал до конца.
С Паскалем работаю по необходимости (вообще пишу на С++), поэтому прошу помочь.
#1
14:34, 10 июля 2006
В приведенном тексте явных проблем не видно. А что значит «не работает readln»? Программа останавливается и ждет ввода? Или выдает ошибку? Или проскакивает readln, забивая переменные каким-то мусором?
И какой компилятор?
#2
14:39, 10 июля 2006
имхо, память где-нить портишь. попробуй поискать баг в работе с деревом
#3
15:13, 10 июля 2006
Ptica
Вместо выполнения оператора readln программа вылетает вместе с компилятором Турбо Паскаль 7.0
#4
16:12, 10 июля 2006
А если сократить ReadLibrary до такого состояния?
procedure ReadLibrary(var lib: tLibrary; var libfile: text); var buffer: char; begin while not eof(libfile) do begin read(libfile,buffer); while not eof(libfile) and (buffer<>’~’) do begin read(libfile,buffer) end; end end;
Если в таком виде она перестанет влиять на работу ReadLn, тогда, скорее всего, прав CD:
>попробуй поискать баг в работе с деревом
#5
16:21, 10 июля 2006
Ptica
Да так и сделал. Прога заработала.
Спасибо CD и спасибо Ptica!
Я скорее верил в мистику (или тупость Паскаля), чем в собственную некомпетентность (в коде в одной из функций сменил = на <> и все заработало).
Хотя странно что неправильное выделение памяти привело к таким последствиям.
Источник: gamedev.ru
Процедура Assign: две частые нетривиальные ошибки
Это самая известная ошибка, которую рано или поздно встречает любой начинающий программист. Взгляните на картинку:
Впервые встретившись с этой ошибкой, можно прийти в недоумение. Файл, из которого мы собираемся читать, на месте. Он доступен и нормально открывается текстовым редактором. Тем не менее, что-то не так. На самом деле, все просто: во время набора текста программы вместо латинской «ЦЭ» была напечатана русская «ЭС». К счастью, такая ошибка единственная в своем роде.
Раскладки «qwerty» и «йцукен» имеют совпадение только в одном месте.
2. Ошибка времени выполнения: «Файл не найден».
Еще одна «механическая» ошибка, связанная с использованием процедуры Assign. В принципе, история похожа на рассказанную выше. Автор программы видит, что файл не найден, идет в папку «123» и не понимает: «Как не найден? Вот же он!»
Все просто: вместо нужного вам текстового файла «55.txt» вы создали файл с именем «55.txt.txt» . Этой ошибки не будет возникать, если вы для себя четко раз и навсегда уясните, что такое расширение в имени файла. И вообще, не пользуйтесь проводником в Windows, а работайте в менеджере файлов, например, в Total Commander.
Источник: whwhwh.ru