Информационный сервер для программистов: Исходники со всего света. Паскальные исходники со всего света
  Powered by Поисковый сервер Яndex: Найдется ВСЁ!
На Главную Pascal Форум Информер Страны мира
   Прочие Программы    >>    setjmp
   
 
 Обработка исключительных ситуаций в TP4.0-7.0   Виктор Вагнер 25.04.1996

В данном модуле реализована старая добрая концепция обработки исключительных ситуаций, которая в языке C присутствовала с самого начала - функции SetJump и LongJump. Если вы имеете опыт их использования, можете дальше не читать.



2k 
 

Модуль 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; { а здесь собственно