Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Вт апр 16, 2024 16:11

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Вложенные обработчики ошибок.
СообщениеДобавлено: Пт апр 20, 2007 06:46 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Иногда необходимо выполнять определенные действия транзактивно, то есть в случае ошибки обработки нужно восстановить, например, измененные переменные, контекст, текущий словарь, закрыть открытый файл и тому подобные вещи. Для этого предназначена эта либа.

Код:

\ 20-04-2007 ~mOleg для SPF4.18
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ вложенные обработчики ошибок.

\ для подключения лишь уникальных слов:
REQUIRE ?: devel\~moleg\lib\util\ifcolon.f

?: ADDR 4 ;  ?: A@ @ ; ?: A! ! ; ?: IS [COMPILE] TO ; IMMEDIATE

\ ---------------------------------------------------------------------------

        \ количество возможных обработчиков на стеке состояний.
        0x10 VALUE #err-handlers

  \ создали стек ошибок
  USER-CREATE ERRORS  #err-handlers CELLS USER-ALLOT

  \ указатель на текущую ошибку
  USER-VALUE cur-err-h

\ при выходе все обработчики выталкиваются из стека и исполняются.
\ В самом низу стека обработчиков ошибок находится неудаляемый базовый
\ обработчик.

\ текущий обработчик ошибок хранится по адресу addr
: err-handler ( --> addr ) cur-err-h ADDR * ERRORS + ;

\ добавивить реакцию в текущий список обработчиков
: ON-ERROR   ( 'cfa --> )
             cur-err-h 1 + #err-handlers MIN TO cur-err-h
             err-handler A! ;

\ вытолкнуть обработчик из стека
\ самый первый обработчик не выталкивается никогда
: EXIT-ERROR ( --> ) cur-err-h 1 - 0 MAX TO cur-err-h ;

\ при возникновении ошибки ее надо обработать согласно установленному
\ порядку обработчиков.
: IS-ERROR ( err-num --> )
           BEGIN cur-err-h WHILE
                 err-handler A@ EXECUTE
                 EXIT-ERROR
           REPEAT
           err-handler A@ EXECUTE ;

\ настройка обработчика - должна выполняться один раз на поток:
        ' ERROR2 err-handler !
        ' IS-ERROR IS ERROR

\EOF -- тестовая секция -----------------------------------------------------

: 1st-err ." first error handler: " ." error number - " DUP . CR ;
: 2st-err ." second error handler " CR ;

' 1st-err ON-ERROR
' 2st-err ON-ERROR

adfasdf  \ это ошибка 8)
\ после отработки ошибок в стеке обработчиков остается лишь один системный



Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт апр 20, 2007 20:48 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
А почему CATCH-THROW не подошло? Они, вроде, должны помогать решать такие задачи...
В чем предлагаемый способ принципиально отличается от того?
Просто мне тоже надо придумать корректное восстановление после ошибок, вот я и выбираю... ;)

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 21, 2007 20:19 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
in4 писал(а):
А почему CATCH-THROW не подошло?


потому что, во-первых, CATCH - это немного другое ( кстати я так и не смог придумать, как на некоторое время устанавливать собственный обработчик - тут на форуме была по этому поводу тема от меня Ж8( )
Во-вторых, CATСH - это перехват ошибки, то есть ее недопущение, а мне нужно обработать возникшую ошибку, которую не поймал ни один CATCH и при этом не перехватывать INTERPRET для этого.
Ну, например, в СПФ нет возможности закрыть все открытые по INCLUDE файлы в случае возникновения ошибки трансляции текста. То есть закроется только самый последний из открытых файлов :dmad;
Или, например, в СПФ если происходит ошибка между : и ; - слово не удаляется из словаря 8( и это с помощью CATCH не поймать.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб апр 21, 2007 21:22 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
in4 писал(а):
А почему CATCH-THROW не подошло? Они, вроде, должны помогать решать такие задачи...

а вот здесь пример использования: http://fforum.winglion.ru/viewtopic.php?t=675#top


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 23, 2007 09:00 
mOleg писал(а):
Ну, например, в СПФ нет возможности закрыть все открытые по INCLUDE файлы в случае возникновения ошибки трансляции текста. То есть закроется только самый последний из открытых файлов
Это не правда — см. определение INCLUDE-FILE в src/compiler/spf_translate.f


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн апр 23, 2007 11:44 
Не в сети

Зарегистрирован: Ср май 03, 2006 11:27
Сообщения: 1394
Откуда: St.Petersburg
Благодарил (а): 2 раз.
Поблагодарили: 11 раз.
mOleg писал(а):
Или, например, в СПФ если происходит ошибка между : и ; - слово не удаляется из словаря 8( и это с помощью CATCH не поймать.


Можно в : вызвать пипа MAIN1 через CATCH. Реализовывать лень.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 25, 2007 02:54 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
rvm писал(а):
Это не правда — см. определение INCLUDE-FILE в src/compiler/spf_translate.f

смотрел внимательно - покажи место, где это делается.

Mihail писал(а):
Можно в : вызвать пипа MAIN1 через CATCH. Реализовывать лень.

Я уже сделал, так что у меня вопрос отпал.
И именно для этого сделан предлагаемый выше механизм


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 25, 2007 15:47 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
mOleg писал(а):
rvm писал(а):Это не правда — см. определение INCLUDE-FILE в src/compiler/spf_translate.f

смотрел внимательно - покажи место, где это делается.


Строки 303-304 писал(а):
DUP >R
['] TranslateFlow RECEIVE-WITH

Файл интерпретируется через TranslateFlow под CATCH'ем (см. RECEIVE-WITH).
Строка 305 писал(а):
R> CLOSE-FILE THROW

Независимо от того было исключение или нет - файл закрывается.
Строка 306 писал(а):
THROW

После этого выкидывается код исключения (возможно нулевой).

Соответственно если файл был подключен из другого файла - это исключение пойдёт дальше и так же будет поймано и все файлы закроются.

ЗЫ Делать такое безаппеляционное заявление не разобрав код (и не приведя даже пример).... Нехорошо по-моему.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср апр 25, 2007 19:01 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
yGREK писал(а):
ЗЫ Делать такое безаппеляционное заявление не разобрав код (и не приведя даже пример).... Нехорошо по-моему.

Спасибо за объяснение. Я не из вредности - просто недоглядел. Просто там идет два THROW подряд.
Тем не менее это не отменяет отсутствие отката при ошибке создания слова.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB