Просто подумал о другом ответе.Это немного тяжело (и, возможно, больше проблем, чем оно того стоит).Но это даст вам нечто, похожее на ваш старый блок финализации
Идея заключалась бы в том, чтобы поместить ваш «финализируемый» код в задачу.Вы не можете покинуть область, в которой объявлена задача, до тех пор, пока задача не завершится.Таким образом, вы можете поместить свой рабочий код в задачу, а ваш код "finally" - только вне области, в которой определена задача. Родительская задача будет сидеть там и ждать завершения рабочей задачи (так или иначе), а затемон будет запускать код «наконец» независимо от того, как он закончился.Недостатком является то, что если задача выдает исключение, она остановится на задаче.Таким образом, вы все еще не совсем понимаете, что вы можете генерировать исключение, и оно будет распространяться автоматически, пока выполняется код «финализации».Возможно, вы могли бы вернуть это поведение, добавив рандеву и вторую задачу (это проблема с задачами. Они как картофельные чипсы ... вам всегда нужна еще одна).
procedure Finalized is
begin
declare
task Worker is end Worker;
task body Worker is begin
--// Working code in here. Can throw exceptions or whatever.
--// Does not matter.
end Worker;
begin
end;
--// If we get here, we know the task finished somehow (for good or ill)
--// so the finalization code goes here.
end Finalized;
Мне кажется,Там может быть способ сделать что-то подобное с защищенными объектами тоже.Я оставлю это для других, чтобы выяснить.