Pascal обработка ошибок

В процессе выполнения скрипта возможно возникновение исключительных ситуаций, ошибок. Если это происходит, то пользователь видит сообщение об ошибке «Опа!…». Вы можете перехватить ошибку и обработать ее особым образом. Для обработки исключительных ситуаций блок кода, в котором они возможны, заключается в составной оператор try.

try
  FS := TFileStream.Create(MyFileName, fmCreate);
except
  MsgBox(‘Ошибка’, ExceptionToString(ExceptionType, ExceptionParam);
end;

Если в блоке try происходит исключение, то выполнение кода прерывается и выполняется код в блоке except.
Есть другая конструкция – try..finally:

try
  FS := TFileStream.Create(MyFileName, fmCreate);
  tryfinally
    FS.Free;
  end;
except
  MsgBox(‘Ошибка’, ExceptionToString(ExceptionType, ExceptionParam);
end;

Код в блоке finally выполняется в любом случае, нормально ли отработал код или произошла ошибка. Если в блоке try используется ключевое слово exit (выход из процедуры/функции), то код в блоке finally также выполняется.
В операторе try могут быть использованы оба блока:

tryexceptfinallyend;

Вы можете программно сгенерировать исключение, используя процедуру 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 все равно выполняется.

TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong

Оператор
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, ����������� ��� ������������� �������������� ��������.

������� ��� ����������� ����� ����������. ����� ����� ���������� ���������������� ���� ����������.

���� ���������� �� ����������, �� ��������� ���������� � �������. ��� ��������� ���������� ������������ �������� tryexcept.

������ ���������� ������������ � �������������, ��������� ����������� ������������, ��� �������, �� �����, ��� ���������� ��������� ��������. � ����� ������ ������������ ���, ��� �������, ��������, ����� ������� ������� ������������ ����������. ��������, ����� ����������� ��������� �������:

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Каким образом реализовать проверку, открылся ли файл?

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
uses crt;
// Считаем вхождения цифр в число
procedure analyze(x:integer);
begin
  while(x>0) do
  begin
    nums[x mod 10] := nums[x mod 10] + 1;
    x:=x div 10;
  end;
end;
 
begin
  assign(input, 'INPUT.TXT'); // Связываем файл INPUT.TXT с файловой пер. input
  {$I-}   // Отключаем контроль ввода/вывода
  reset(input);
  {$I+}   // Включаем контроль ввода/вывода
  if IOResult <> 0  // Выход, если файл не открыт
    then
      begin
        writeln ('Невозможно открыть INPUT.TXT');
        writeln;
        Halt;
      end;
  assign(output, 'OUTPUT.TXT');
  {$I-}
  rewrite(output);
  {$I+}
  if IOResult <> 0
    then
      begin
        writeln ('Невозможно открыть OUTPUT.TXT');
        writeln;
        Halt;
      end;
  if(EOF(input)) then
    begin
      writeln('Файл INPUT.TXT пуст.');
      halt;
    end
  else
    read(input, a, b);
 
  // ...
 
  // Закрываем файлы
  close(input);
  close(output);
 
  writeln('Успешно завершено.');
end.

Код не компилируется, ошибка «Неизвестное имя IOResult»

0

volvo

Супер-модератор

Эксперт Pascal/DelphiАвтор FAQ

32505 / 20989 / 8117

Регистрация: 22.10.2011

Сообщений: 36,260

Записей в блоге: 7

23.10.2012, 23:18

2

TopLoader, в PascalABC.NET отсутствует контроль ошибок через IOResult, теперь это делается через отлов исключений:

Pascal
1
2
3
4
5
6
7
8
9
  try
    assign(input, 'INPUT.TXT'); // Связываем файл INPUT.TXT с файловой пер. input
    reset(input);
  except
    writeln ('Невозможно открыть INPUT.TXT');
    writeln;
    Halt;
  end;
  // дальше пытаешься аналогично открыть output.txt

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 все равно выполняется.

TwitterSEO CommunityВаау!News2.ruChippKoricaSMI2Google BookmarksDiggI.uaЗакладки YandexLinkstoreMyscoopCommunizmRu-marksWebmarksRuspaceLinkomaticKli.kzWeb-zakladkaZakladok.netRedditdeliciousMa.gnoliaTechnoratiSlashdotYahoo My WebБобрДобр.ruMemori.rurucity.comМоёМесто.ruMister Wong

Понравилась статья? Поделить с друзьями:

Интересное по теме:

  • Pascal коды ошибок
  • Pascal assign ошибка
  • Partlibclient dll ошибка
  • Partlibclient dll исправить ошибку
  • Pantum ошибка 103f

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии