英文:
How do you handle resourece release while handling an exception in ADA?
问题
ADA是否有类似于C++的析构函数或Java的try-with-resources的等价物?也就是说,我是否可以在函数中表达,无论是正常退出还是由于异常处理,都会在函数退出时释放在该函数中获取的资源?在ADA中是否有表达这种概念的方法?
英文:
Does ADA have an equivalent of C++'s destructors or Java's try-with-resources? That is, a technique where I can say that a resource acquired in this function is released when this function exits: whether normally or due to the handling of an exception. Is there a way to express such concept in ADA?
答案1
得分: 4
考虑使用 Ada.Finalization.Limited_Controlled
(ARM 7.6, 赋值和终结)。
(为什么使用 limited
?因为您真的不希望复制您创建的对象以释放资源)。
这是一个非常简单的概念演示;在我输出 ** finalizing a Protector **
的地方释放资源。
with Ada.Finalization;
with Ada.Text_IO; use Ada.Text_IO;
procedure Raii is
type Protector is new Ada.Finalization.Limited_Controlled
with null record;
overriding procedure Finalize (Obj : in out Protector);
procedure Finalize (Obj : in out Protector)
is
begin
Put_Line ("** finalizing a Protector **");
end Finalize;
begin
Put_Line ("声明一个简单的作用域");
declare
P : Protector;
begin
Put_Line ("退出作用域");
end;
Put_Line ("声明一个通过异常退出的作用域");
begin
declare
P : Protector;
begin
Put_Line ("引发约束错误");
raise Constraint_Error;
end;
exception
when Constraint_Error =>
Put_Line ("捕获到约束错误");
end;
Put_Line ("完成。");
end Raii;
输出是:
$ ./raii
声明一个简单的作用域
退出作用域
** finalizing a Protector **
声明一个通过异常退出的作用域
引发约束错误
** finalizing a Protector **
捕获到约束错误
完成。
英文:
Consider using Ada.Finalization.Limited_Controlled
(ARM 7.6, Assignment and Finalization).
(why limited
? because you really don’t want to copy the object you’ve created so as to release the resource).
This is a very very simple demo of the concept; release the resource at the point where I output ** finalizing a Protector **
.
with Ada.Finalization;
with Ada.Text_IO; use Ada.Text_IO;
procedure Raii is
type Protector is new Ada.Finalization.Limited_Controlled
with null record;
overriding procedure Finalize (Obj : in out Protector);
procedure Finalize (Obj : in out Protector)
is
begin
Put_Line ("** finalizing a Protector **");
end Finalize;
begin
Put_Line ("declaring a simple scope");
declare
P : Protector;
begin
Put_Line ("quitting the scope");
end;
Put_Line ("declaring a scope to be quit via an exception");
begin
declare
P : Protector;
begin
Put_Line ("raising CE");
raise Constraint_Error;
end;
exception
when Constraint_Error =>
Put_Line ("CE caught");
end;
Put_Line ("done.");
end Raii;
The output is
$ ./raii
declaring a simple scope
quitting the scope
** finalizing a Protector **
declaring a scope to be quit via an exception
raising CE
** finalizing a Protector **
CE caught
done.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论