Модуль SETJMP
Обработка исключительных ситуаций
для Turbo/Borland Pascal 4.0-7.0
Copyright(c) SoftWeyr, 1996
В данном модуле реализована старая добрая концепция обработки
исключительных ситуаций, которая в языке C присутствовала с самого
начала - функции SetJump и LongJump. Если вы имеете опыт их
использования, можете дальше не читать.
Если нет, то это работает так:
Перед выполнением критического участка программы вы запоминаете
текущий контекст (стэк и указатель на текущую выполняемую команду) с
помощью SetJump.
Когда у вас возникает ошибка, вы в том месте, где вы узнали о ее
возникновении (обычно в процедуре завершения, на которую указывает
переменная ExitProc модуля System) вызываете LongJump и он возвращает
управление в ту точку, где был запомнен контекст.
Для того, чтобы вы могли отличить, каким образом управление попало
в это место - просто после выполнения SetJump или в результате LongJump,
функция SetJump возвращает значение. При нормальном выполнении это 0, а
если был выполнен LongJump, то значение, переданное ему в качестве
второго параметра.
Например так.
{$I+}{Включим обработку ошибок ввода-вывода}
uses SetJMP;
var JmpBuf:JumpBuffer;
Procedure MyExitProc;far;
begin
if ErrorAddr<>0 then
begin
{ Была ошибка}
ErrorAddr:=nil;
LongJump(JmpBuf,ExitCode);
end;
end;
var F:Text;
Name:String;
Success:Boolean;
begin
ExitProc:=@MyExitProc;
Success:=False;
Repeat
Write('Введите имя файла=>');
Readln(Name);
Case SetJump(JmpBuf) of
0:begin
Assign(F,Name);
Reset(F);
Success:=True;
end;
2:begin
Writeln('Ошибка!!! Не найден файл ',Name);
end;
3:begin
Writeln('Ошибка!!! Неправильный путь к файлу ',Name);
end;
{и так далее}
end;
until Success;
{ а здесь собственно
|