OberonCore https://forum.oberoncore.ru/ |
|
Менее минимистичная обработка исключений https://forum.oberoncore.ru/viewtopic.php?f=27&t=6928 |
Страница 1 из 1 |
Автор: | budden [ Вторник, 11 Апрель, 2023 18:41 ] |
Заголовок сообщения: | Менее минимистичная обработка исключений |
В A2/ЯОС фактически есть обработка исключений, а именно, там есть блок Finally и раскрутка стека. При возникновении исключения стек раскручивается до какого-то дна, каковым, видимо, является процесс. Это здорово в том смысле, что нет обработчиков исключения в пользовательском коде. Однако это преимущество слегка иллюзорное. Блоки Finally всё равно обрабатываются во время обработки исключения, а значит, испортить всё дело они могут. Просто ставим там бесконечный цикл и приехали - исключение никогда нормально не завершится. Если же мы снимаем процесс, то скорее всего блоки Finally не обработаются. Не обработаются они и в случае, если процесс зациклится, зависнет на блокировке (а может быть, и если переполнит стек). Таким образом, блоки Finally представляют из себя слегка иллюзорную форму защиты ресурсов или гарантированного выполнения чего-то, даже если случилась ошибка. Здесь Оберон никак не уникален - подобные проблемы есть в любом языке. Но я пишу это к тому, что невинность сохранить здесь уже не удалось. А раз так, то можно пускаться во все тяжкие. Что можно добавить в обработку исключений, чтобы она осталась минималистичной, но в то же время была чуть более развитой? На самом деле не знаю, что я тут подразумеваю под "развитостью". В некоторых случаях хочется использовать исключения для быстрого завершения какой-то деятельности без того, чтобы плодить кучу кодов возврата. |
Автор: | Sergej Durmanov [ Вторник, 11 Апрель, 2023 19:11 ] |
Заголовок сообщения: | Re: Менее минимистичная обработка исключений |
finally выполняется после обработчика исключения - просто передается управление обратно в пользовательский код. Это можно наблюдать запустив систе у тестов FoxTest - вылетают трапы при неудаче, но тесты продолжают работать, процедуры (из finally) возвращают значения в return expr... |
Автор: | budden [ Вторник, 11 Апрель, 2023 20:02 ] |
Заголовок сообщения: | Re: Менее минимистичная обработка исключений |
Да, перед тем, как писать, мне надо было бы разобраться, как там всё работает. Но я точно не вижу никакой возможности ни бросить разные исключения, ни вмешаться в их обработку. Значит, надо это сделать сейчас. Я смотрю не на тесты, а на команды - они тоже обладают свойством выживать после исключений. Там имеется атрибут 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, видимо, чтобы легче было догадаться. На других платформах, видимо, это делается по-другому. Не будучи бабушкой Вангой, рискну предположить, что и в тестовом движке работа устроена так же. Насчёт того, что раскрутка стека выполняется после обработки исключения - не готов пока что поверить, хотя, если бы это было правдой, то было бы прекрасно. Хотя, конечно. если речь идёт о той простейшей обработке исключения, которая выводит стек на экран и куда там ещё надо, то может быть. В этом случае сценарий такой:
Это лишь моя гипотеза, но я уверен в ней процентов на 80. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |