Да, перед тем, как писать, мне надо было бы разобраться, как там всё работает. Но я точно не вижу никакой возможности ни бросить разные исключения, ни вмешаться в их обработку. Значит, надо это сделать сейчас.
Я смотрю не на тесты, а на команды - они тоже обладают свойством выживать после исключений. Там имеется атрибут 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.