В процессе выполнения скрипта возможно возникновение исключительных ситуаций, ошибок. Если это происходит, то пользователь видит сообщение об ошибке «Опа!…». Вы можете перехватить ошибку и обработать ее особым образом. Для обработки исключительных ситуаций блок кода, в котором они возможны, заключается в составной оператор try.
try FS := TFileStream.Create(MyFileName, fmCreate); except MsgBox(‘Ошибка’, ExceptionToString(ExceptionType, ExceptionParam); end;
Если в блоке try происходит исключение, то выполнение кода прерывается и выполняется код в блоке except.
Есть другая конструкция – try..finally:
try FS := TFileStream.Create(MyFileName, fmCreate); try … finally FS.Free; end; except MsgBox(‘Ошибка’, ExceptionToString(ExceptionType, ExceptionParam); end;
Код в блоке finally выполняется в любом случае, нормально ли отработал код или произошла ошибка. Если в блоке try используется ключевое слово exit (выход из процедуры/функции), то код в блоке finally также выполняется.
В операторе try могут быть использованы оба блока:
try … except … finally … end;
Вы можете программно сгенерировать исключение, используя процедуру RaiseException:
var filename, emsg: string; begin filename = ''; try if filename = '' then RaiseException(erCustomError, 'Имя файла не может быть пустым'); … except emsg := ExceptionToString(ExceptionType, ExceptionParam); … end; end;
При обработке исключительных ситуаций могут быть использованы следующие процедуры и функции:
function ExceptionToString(Err: TIFException; Param: String): String
Формирует по типу исключения строку сообщения об ошибке.
function ExceptionType: TIFException
Возвращает тип возникшего исключения.
function ExceptionParam: String
Возвращает текст сообщения об ошибке.
procedure RaiseException(Err: TIFException; Param: String)
Генерирует исключительную ситуацию.
procedure RaiseLastException
Генерирует последнюю возникшую исключительную ситуацию.
Классы исключений определены в модулях Classes и SysUtils. Используются для обработки исключительных ситуаций, возникающих при исполнении программы. Например, попытка открыть файл, которого нет.
Базовый класс исключений – Exception. Его потомки – классы исключений, имена которых начинаются с символа E, за которым следует описание исключения на английском языке.
В модуле SusUtils опредлено много исключений. Вот примеры:
- EIntError – ошибка операции с целыми числами.
- EZeroDivide – деление на ноль.
- ERangeError – ошибка диапазона.
- EIntOverflow – ошибка переполнения.
- EMathError – математическая ошибка.
Для обработки исключений предусмотрены три инструкции:
- инструкции Raise,
- блоки try…except,
- блоки try…finally.
Внимание. Эти инструкции доступны в режимах Delphi и ObjPas. В режиме Turbo Pascal они невозможны.
Инструкция Raise
Инструкция Raise запускает исключение, которое предварительно должно быть определено, как экземпляр класса исключений. Формат инструкции:
Raise <Экземпляр класса>;
При возникновении объявленного исключения инициализируется экземпляр класса этого исключения. Пример обработки деления на ноль, когда этому исключению дано уникальное имя:
Type EDivException = Class(Exception);
Function DoDiv (X,Y : Longint) : Integer;
begin
If Y=0 then
Raise EDivException.Create (’Division by Zero would occur’);
Result := X Div Y;
end;
Инструкция try…except
Формат инструкции:
try // Попробуй
< Инструкции >
except // Исключения
<обработчики исключений>
end; // Конец
Алгоритм инструкции:
- Выполняется секция try.
- Если исключение не возникает, то инструкция завершается.
- Если исключение возникает, то секция try завершается и выполняется обработчик возникшего исключения из секции except.
Формат обработчика исключений в секции except
on
<класс исключения>
do < Инструкция >; // Любая инструкция, кроме goto
end;
Пример обработки деления на ноль (использованы средства из предыдущего примера):
Try
Z := DoDiv (X,Y);
Except
On EDivException do Z := 0;
end;
Инструкция try…finally
В ней при возникновении исключения секция try завершается, исключение специально не обрабатывается, но всегда исполняется секция finally. Формат инструкции:
try // Попробуй
<Инструкции >
finally // Финально
< Инструкции >
end; // Конец
Алгоритм инструкции
- Выполняется группа try.
- Если исключение возникло, то все инструкции, следующие после инструкции, вызвавшей исключение, пропускаются, и управление передается первой инструкция секции finally.
Если исключений не возникло, то секция finally все равно выполняется.
Оператор
try
… except
имеет вид:
try
операторы
except
блок обработки исключений
end;
Блок
try
называется защищаемым блоком. Если
при выполнении программы в нем происходит
ошибка, то он завершается и выполнение
передается блоку except.
Если исключение обрабатывается в блоке
except,
то после его обработки программа
продолжает выполняться с оператора,
следующего за try
… except
… end.
Если исключение остается необработанным
и имеется объемлющий блок try,
то выполнение передается его блоку
except.
Если объемлющего блока try
нет, то программа завершается с ошибкой.
Наконец, если в блоке try ошибки не
произошло, то блок except
игнорируется и выполнение программы
продолжается дальше.
Если
в процессе обработки исключения (в блоке
except)
произошло другое исключение, то текущий
блок except
завершается, первое исключение остается
необработанным и обработка нового
исключения передается объемлющему
блоку try.
Таким образом, в каждый момент времени
существует максимум одно необработанное
исключение.
Блок
обработки исключений представляет
собой либо последовательность операторов,
разделенных точкой с запятой, либо
последовательность обработчиков
исключений вида
on
имя:
тип do
оператор;
где
тип — тип исключения (должен быть
производным от типа Exception),
имя — имя переменной исключения (имя
с последующим двоеточием может быть
опущено). В первом случае при обработке
исключения выполняются все операторы
из блока except.
Во втором случае среди обработчиков
осуществляется поиск типа текущего
исключения, и если обработчик найден,
то выполняется соответствующий оператор
обработки исключения, в противном случае
исключение считается необработанным
и передается объемлющему блоку try.
Следует
обратить внимание, что имя переменной
исключения в разных обработчиках может
быть одинаковым, т.е. оно локально по
отношению к обработчику.
Поиск
типа исключения в обработчиках
производится с учетом наследования:
исключение будет обработано, если оно
принадлежит к указанному в обработчике
типу или производному от него. Поэтому
принято записывать вначале обработчики
производных классов, а затем — обработчики
базовых (в противном случае обработчик
исключения производного класса никогда
не сработает). Обработчик исключения
Exception
обрабатывает все возможные исключения
и поэтому должен быть записан последним.
Пример.
try
readln(x);
writeln(ctg(x)/(x-1));
…
except
on
EZeroDivide do
writeln(‘Деление
на
0’);
on
e: ECtgError do
writeln(e.Message);
end;
Оператор try … Finally
Оператор
try
… finally
имеет вид:
try
операторы
finally
операторы
end;
Операторы
в блоке finally
выполняются безотносительно к тому,
возникло или нет исключение в блоке
try.
При этом само исключение не обрабатывается.
Блок
finally
используется для возвращения ранее
выделенных ресурсов.
Пример
1. Закрытие открытого файла.
reset(f);
try
…
finally
close(f);
end;
Файл
будет закрыт независимо от того, произошло
ли ислючение в блоке try.
Пример
2. Возвращение выделенной динамической
памяти.
New(p);
try
…
finally
Dispose(p);
end;
Динамическая
память, контролируемая указателем p,
будет возвращена независимо от того,
произошло ли ислючение в блоке try.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Простая инструкция по добавлению обработки ошибок в Паскале
Введение
Обработка ошибок — важная часть кодирования программ на языке Паскаль. Обычно она связана с отслеживанием и исправлением ошибок во время выполнения программы. В этой статье мы рассмотрим, как добавить обработку ошибок в программы на Паскале.
Шаг 1. Определение исключений
Первым шагом в добавлении обработки ошибок является определение исключений. Исключения — это тип данных, который представляет возможную ошибку, которая может произойти во время выполнения программы. Обычно это ошибки, такие как деление на ноль или недостаточное количество памяти.
Пример определения исключения:
type
EMyException = class(Exception);
Шаг 2. Генерация и обработка исключений
После того, как вы определили исключение, следующим шагом является генерация исключения в случае возникновения ошибки и обработка его в блоке try-except. Блок try-except позволяет отслеживать и распознавать исключения, которые могут произойти во время выполнения программы, и обеспечивает метод их обработки.
Пример генерации и обработки исключения:
try
// некоторый код, где может произойти ошибка
except
on E: EMyException do
begin
// обработка исключения
end;
end;
Шаг 3. Отлов нескольких исключений
Если в вашей программе могут происходить несколько типов ошибок, вы можете использовать несколько блоков except для отслеживания и обработки каждого из них.
Пример отлова нескольких исключений:
try
// некоторый код, где может произойти ошибка
except
on E: EMyException do
begin
// обработка EMyException
end;
on E: EOtherException do
begin
// обработка EOtherException
end;
end;
Заключение
Добавление обработки ошибок в программу на Паскале является важным элементом создания надежной программы. Определение исключений, генерация и обработка их в блоке try-except и отлов нескольких исключений можно легко реализовать в Паскале.
��������� ����������
��������� ����������: �����
����� �� ����� ���������� ��������� ���������� ������, ������������ ��� ���������� ����������, ������� ����� ����������� � ����������. ���������� ������������ ����� ������ ������, ������������ �� ������ Exception, ����������� ��� ������������� �������������� ��������.
������� ��� ����������� ����� ����������. ����� ����� ���������� ���������������� ���� ����������.
���� ���������� �� ����������, �� ��������� ���������� � �������. ��� ��������� ���������� ������������ �������� try … except.
������ ���������� ������������ � �������������, ��������� ����������� ������������, ��� �������, �� �����, ��� ���������� ��������� ��������. � ����� ������ ������������ ���, ��� �������, ��������, ����� ������� ������� ������������ ����������. ��������, ����� ����������� ��������� �������:
function mymod(a,b: integer): integer;
begin
Result := a — (a div b) * b;
end;
���� ������� mymod(1,0), �� ����� ���������� ���������� System.DivideByZeroException �������������� ������� �� 0.
���������� ������� ������� ���������� ��������� �������� ������ ������� mymod:
function mymod(a,b: integer): integer;
begin
if b = 0 then
writeln(‘������� mymod: ������� �� 0’);
Result := a — (a div b) * b;
end;
�������� ������� �������� ������, ��������� �����������, ��������������� ������� mymod, �� �����, ��� ��� ����� ��������������. ��������, ��� ������ ������� mymod � ����� �� ������ �� ������ ������������ ��������� �� ������.
���������� ������ — �������� �������� ������� ������� � ������������ ���������� System.DivideByZeroException:
try
readln(a,b);
writeln(mymod(a,b) mod (a-1));
…
except
on System.DivideByZeroException do
writeln(‘������� �� 0’);
end;
������� �� ������ ������ ������� ������� � ���, ��� ��� ���������� ��������� �� ���� ���������� ��������, ������� ���������� ��������� ��� ��������� ����������. ��� ����� ���� ������������� ��������� �� ������, ����� � ���� ������ ��� ������ �������� (� ������, ����� ��������� ��������� �������� ����������).
������, ������ ������� �������� ������������ �����������: ���������� System.DivideByZeroException ����� ���������� � ��� a=1 � �� ����� ������� � �������� mymod. ��� ���������� ��������� ���������� ��������� ����������� ����� ���������� � �������� ��� � ������� mymod:
type MyModErrorException = class(System.Exception) end;
function mymod(a,b: integer): integer;
begin
if b = 0 then
raise new MyModErrorException(‘������� mymod: ������� �� 0’);
Result := a — (a div b) * b;
end;
����� ��������� ������ ����� ��������� ���:
try
readln(a,b);
writeln(mymod(a,b) mod (a-1));
…
except
on System.DivideByZeroException do
writeln(‘������� �� 0’);
on e: MyModErrorException do
writeln(e.Message);
else writeln(‘�����-�� ������ ����������’)
end;
���� ������� MyModErrorException ����������� ������ System.ArithmeticException, ��� � System.DivideByZeroException, �� ��������� ��� ����� ���������:
type MyModErrorException = class(System.ArithmeticException) end;
…
try
readln(a,b);
writeln(mymod(a,b) mod (a-1));
…
except
on e: System.ArithmeticException do
writeln(e.Message);
else writeln(‘�����-�� ������ ����������’)
end;
�������, ����� ��������� ��������� �������. ���������� � ������� mymod ���������� System.DivideByZeroException � � ����� ����������� ����� — MyModErrorException:
function mymod(a,b: integer): integer;
begin
try
Result := a — (a div b) * b;
except
on e: System.DivideByZeroException do
raisenew MyModErrorException(‘������� mymod: ������� �� 0’);
end;
end;
Читайте также
ГЛАВА 4 Обработка исключений
ГЛАВА 4
Обработка исключений
Основное внимание в данной главе сфокусировано на структурной обработке исключений (Structured Exception Handling, SEH), но наряду с этим обсуждены также обработчики управляющих сигналов консоли и векторная обработка исключений (Vectored Exception Handling, VEH).SEH
Пример: обработка ошибок как исключений
Пример: обработка ошибок как исключений
В предыдущих примерах для обработки ошибок при выполнении системных вызовов и других ошибок используется функция ReportError. Эта функция прекращает выполнение процесса, если программист указал, что данная ошибка является
SEH и обработка исключений в C++
SEH и обработка исключений в C++
При обработке исключений в C++ используются ключевые слова catch и throw, а сам механизм исключений реализован с использованием SEH. Тем не менее, обработка исключений в C++ и SEH — это разные вещи. Их совместное применение требует внимательного
Векторная обработка исключений
Векторная обработка исключений
Функции обработки исключений можно непосредственно связывать с исключениями, точно так же, как обработчики управляющих сигналов консоли можно связывать с управляющими событиями консоли. В этом случае, если возникает исключение, то
13.1.5. Обработка исключений
13.1.5. Обработка исключений
Что произойдет, если в потоке возникнет исключение? Как выясняется, поведение можно сконфигурировать заранее.Существует флаг abort_on_exception, который работает как на уровне класса, так и на уровне экземпляра. Он реализован в виде метода доступа (то
Обработка исключений
Обработка исключений
Исключение (exception) — это результат выполнения некорректного оператора, что привело к возникновению ошибки. В языке Object Pascal для обработки исключений предназначена специальная конструкция:try //Операторы, которые могут привести к возникновению
Обработка исключений
Обработка исключений
Ввиду того, что теперь метод Accelerate() может генерировать исключение, вызывающая сторона должна быть готова обработать такое исключение. При вызове метода, способного генерировать исключение, вы должны использовать блок try/catch. Приняв исключение, вы
Обработка множеств исключений
Обработка множеств исключений
В простейшем варианте блок try имеет единственный блок catch. Но на практике часто возникает ситуация, когда операторы в рамках блока try способны создавать множество возможных исключений. Например, представьте себе, что метод Accelerate()
11. Обработка исключений
11. Обработка исключений
Обработка исключений – это механизм, позволяющий двум независимо разработанным программным компонентам взаимодействовать в аномальной ситуации, называемой исключением. В этой главе мы расскажем, как генерировать, или возбуждать, исключение в
Обработка исключений
Обработка исключений
Код PSQL может перехватывать ошибки при их появлении и затем их обрабатывать в подпрограмме обработки исключений. Если исключение будет обработано в вашем коде- вы обеспечите исправление или обход ошибки и позволите продолжить выполнение, — то
Обработка исключений
Обработка исключений
Ошибки в isql обрабатываются тем же образом, что и приложении DSQL. isql отображает сообщение об ошибке, содержащее переменную SQLCODE и текст сообщения из массива состояния Firebird, как показано на рис. 37.4.
Рис. 37.4. Пример сообщения об ошибке в isqlОшибки SQL со
Продвинутая обработка исключений
Продвинутая обработка исключений
Чрезвычайно простой механизм, разработанный до сих пор, удовлетворяет большинству потребностей обработки исключений. Но некоторые приложения могут требовать более тонкой настройки:[x]. Возможно, требуется определить природу последнего
TopLoader 43 / 43 / 6 Регистрация: 10.12.2011 Сообщений: 128 |
||||
1 |
||||
Контроль ошибок при открытии файлов23.10.2012, 21:31. Показов 1810. Ответов 1 Метки нет (Все метки)
Каким образом реализовать проверку, открылся ли файл?
Код не компилируется, ошибка «Неизвестное имя IOResult» 0 |
volvo Супер-модератор 32505 / 20989 / 8117 Регистрация: 22.10.2011 Сообщений: 36,260 Записей в блоге: 7 |
||||
23.10.2012, 23:18 |
2 |
|||
TopLoader, в PascalABC.NET отсутствует контроль ошибок через IOResult, теперь это делается через отлов исключений:
2 |
Классы исключений определены в модулях Classes и SysUtils. Используются для обработки исключительных ситуаций, возникающих при исполнении программы. Например, попытка открыть файл, которого нет.
Базовый класс исключений – Exception. Его потомки – классы исключений, имена которых начинаются с символа E, за которым следует описание исключения на английском языке.
В модуле SusUtils опредлено много исключений. Вот примеры:
- EIntError – ошибка операции с целыми числами.
- EZeroDivide – деление на ноль.
- ERangeError – ошибка диапазона.
- EIntOverflow – ошибка переполнения.
- EMathError – математическая ошибка.
Для обработки исключений предусмотрены три инструкции:
- инструкции Raise,
- блоки try…except,
- блоки try…finally.
Внимание. Эти инструкции доступны в режимах Delphi и ObjPas. В режиме Turbo Pascal они невозможны.
Инструкция Raise
Инструкция Raise запускает исключение, которое предварительно должно быть определено, как экземпляр класса исключений. Формат инструкции:
Raise <Экземпляр класса>;
При возникновении объявленного исключения инициализируется экземпляр класса этого исключения. Пример обработки деления на ноль, когда этому исключению дано уникальное имя:
Type EDivException = Class(Exception);
Function DoDiv (X,Y : Longint) : Integer;
begin
If Y=0 then
Raise EDivException.Create (’Division by Zero would occur’);
Result := X Div Y;
end;
Инструкция try…except
Формат инструкции:
try // Попробуй
< Инструкции >
except // Исключения
<обработчики исключений>
end; // Конец
Алгоритм инструкции:
- Выполняется секция try.
- Если исключение не возникает, то инструкция завершается.
- Если исключение возникает, то секция try завершается и выполняется обработчик возникшего исключения из секции except.
Формат обработчика исключений в секции except
on
<класс исключения>
do < Инструкция >; // Любая инструкция, кроме goto
end;
Пример обработки деления на ноль (использованы средства из предыдущего примера):
Try
Z := DoDiv (X,Y);
Except
On EDivException do Z := 0;
end;
Инструкция try…finally
В ней при возникновении исключения секция try завершается, исключение специально не обрабатывается, но всегда исполняется секция finally. Формат инструкции:
try // Попробуй
<Инструкции >
finally // Финально
< Инструкции >
end; // Конец
Алгоритм инструкции
- Выполняется группа try.
- Если исключение возникло, то все инструкции, следующие после инструкции, вызвавшей исключение, пропускаются, и управление передается первой инструкция секции finally.
Если исключений не возникло, то секция finally все равно выполняется.