Java有一个finalize块,允许在一个块离开后执行一些语句(即使引发了异常也会执行).例:
try {
...
} catch (Exception e) {
...
} finally {
... // any code here
}
Run Code Online (Sandbox Code Playgroud)
Ada具有允许实现Finalize操作的受控对象,但没有与java中相同的finalize块.这对于记录,关闭文件,事务等非常有用(无需为每个可能的块创建特定的标记类型).
我相信这段代码会满足您的要求;它成功地打印出42带有presentraise或with 的内容return。这是 TED 建议的实现。
在 Mac OS X、Darwin 10.6.0 上使用 GCC 4.5.0 进行测试。
with Ada.Finalization;
package Finally is
-- Calls Callee on deletion.
type Caller (Callee : not null access procedure)
is new Ada.Finalization.Limited_Controlled with private;
private
type Caller (Callee : not null access procedure)
is new Ada.Finalization.Limited_Controlled with null record;
procedure Finalize (Object : in out Caller);
end Finally;
package body Finally is
procedure Finalize (Object : in out Caller)
is
begin
Object.Callee.all;
end Finalize;
end Finally;
with Ada.Text_IO; use Ada.Text_IO;
with Finally;
procedure Finally_Demo is
begin
declare
X : Integer := 21;
-- The cleanup procedure, to be executed when this block is left
procedure F
is
begin
Put_Line ("X is " & Integer'Image (X));
end F;
-- The controlled object, whose deletion will execute F
F_Caller : Finally.Caller (F'Access);
begin
X := 42;
raise Constraint_Error;
end;
end Finally_Demo;
Run Code Online (Sandbox Code Playgroud)