OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 00:08

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 3 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 11 Апрель, 2023 18:41 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
В A2/ЯОС фактически есть обработка исключений, а именно, там есть блок Finally и раскрутка стека. При возникновении исключения
стек раскручивается до какого-то дна, каковым, видимо, является процесс. Это здорово в том смысле, что нет обработчиков исключения в пользовательском коде. Однако это преимущество слегка иллюзорное. Блоки Finally всё равно обрабатываются во время обработки исключения, а значит, испортить всё дело они могут. Просто ставим там бесконечный цикл и приехали - исключение никогда нормально не завершится. Если же мы снимаем процесс, то скорее всего блоки Finally не обработаются. Не обработаются они и в случае, если процесс зациклится, зависнет на блокировке (а может быть, и если переполнит стек). Таким образом, блоки Finally представляют из себя слегка иллюзорную форму защиты ресурсов или гарантированного выполнения чего-то, даже если случилась ошибка.

Здесь Оберон никак не уникален - подобные проблемы есть в любом языке. Но я пишу это к тому, что невинность сохранить здесь уже не удалось. А раз так, то можно пускаться во все тяжкие.

Что можно добавить в обработку исключений, чтобы она осталась минималистичной, но в то же время была чуть более развитой? На самом деле не знаю, что я тут подразумеваю под "развитостью". В некоторых случаях хочется использовать исключения для быстрого завершения какой-то деятельности без того, чтобы плодить кучу кодов возврата.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Апрель, 2023 19:11 

Зарегистрирован: Пятница, 11 Январь, 2019 19:26
Сообщения: 293
Откуда: Russia
finally выполняется после обработчика исключения - просто передается управление обратно в пользовательский код. Это можно наблюдать запустив систе у тестов FoxTest - вылетают трапы при неудаче, но тесты продолжают работать, процедуры (из finally) возвращают значения в return expr...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 11 Апрель, 2023 20:02 

Зарегистрирован: Понедельник, 11 Сентябрь, 2017 13:23
Сообщения: 1557
Да, перед тем, как писать, мне надо было бы разобраться, как там всё работает. Но я точно не вижу никакой возможности ни бросить разные исключения, ни вмешаться в их обработку. Значит, надо это сделать сейчас.

Я смотрю не на тесты, а на команды - они тоже обладают свойством выживать после исключений. Там имеется атрибут SAFE. Дальше это работает так:

Код:
    Runner = окласс(Modules.ЛХА)
        (* ... *)
        exception : булево; (* изначально ставится в значение "ложь" *)
        (* ... *)

    нач {активное, SAFE}
        Objects.SetContext(context);
        если ~exception то
            exception := истина;
            module := Modules.ThisModule(moduleName, res, msg);
            дайПроцПоИмени(moduleName, commandName, proc);
            proc();
        иначе
            res := CommandTrapped; копируйСтрокуДо0("Exception during command execution", msg);
        всё;
    кон Runner;

Волшебный модификатор SAFE делает так, чтобы тело процесса перезапускалось в случае возникновения исключения (а не просто возвращало исполнение в пользовательский код). Я не знаю, где это должно быть написано, но в описании ЯОС это сейчас будет написано :)

В Unix.Objects за перезапуск отвечает ExitTrap, которая пользуется longjmp, а setjmp делается при запуске процесса при наличии флага Restart = 0. В промежуточном хвосте компилятора {Restart} кодируется просто числом 1, видимо, чтобы легче было догадаться. На других платформах, видимо, это делается по-другому.

Не будучи бабушкой Вангой, рискну предположить, что и в тестовом движке работа устроена так же. Насчёт того, что раскрутка стека выполняется после обработки исключения - не готов пока что поверить, хотя, если бы это было правдой, то было бы прекрасно. Хотя, конечно. если речь идёт о той простейшей обработке исключения, которая выводит стек на экран и куда там ещё надо, то может быть. В этом случае сценарий такой:

  • делим на 0
  • возникает исключение
  • печатается стек и подаётся команда на красное окно
  • раскрутка стека и выполнение блоков FINALLY(в ЯОС они называются "выходя").
  • выпадение из активного объекта, если он обычный (на этом его история завершается) или перезапуск тела, если он SAFE

Это лишь моя гипотеза, но я уверен в ней процентов на 80.


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB