首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ada 83例外是否包括资源清理?

Ada 83例外是否包括资源清理?
EN

Stack Overflow用户
提问于 2022-04-16 18:41:07
回答 2查看 102关注 0票数 2

Ada 83是最早有例外情况的语言之一。(我想说“第一次”,但我从研究技术历史中学到的一件事是,几乎总是有一个较早的X。)

从实现的角度来看,实现异常最复杂的部分是它们与资源清理的交互( C++中的析构函数,最后是Java中的destructors);当抛出异常时,在退出每个动态嵌套的范围时,需要在退出时运行资源清理代码。

Ada 83是否有例外以这种方式调用的资源清理功能?或者,实现可以直接执行长时间操作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-17 06:03:42

问题不在于异常是否真正清理资源,而是是否保留声明作用域(例如子程序体或块语句)清理在该范围内分配的资源。离开范围的原因是次要的问题。无论执行是通过到达作用域的“结束”还是传播在作用域中引发但不在作用域中处理的异常,这都无关紧要。

Ada 83对“资源”的概念非常有限,但确实试图清理这些资源。当保留作用域时,带作用域的所有局部变量的堆栈框架将被移除。如果作用域声明了一个本地访问类型,特别是如果声明有一个Storage_Size子句,则在保留该范围时(尽管我认为这不是一个严格的要求,而且有些编译器可能没有实现),可以删除该访问类型的动态分配对象的整个“集合”(解除分配,释放)。如果作用域是某些任务的主(“所有者”),则任务必须终止才能保留作用域(但程序员有责任以某种方式通知应该终止的任务,或中止任务)。

但是对于今天被认为是“资源”的大部分内容,例如具有非本地访问类型的本地堆分配、打开本地声明的文件等等,Ada 83不会在保留本地范围时自动清理这些本地资源分配。通常的成语是这样的作用域有一个本地异常处理程序来清理资源,然后(如果需要的话)重新引发异常或引发另一个异常。

票数 5
EN

Stack Overflow用户

发布于 2022-04-16 20:15:29

允许在引发异常之前执行资源清理,但Ada 83异常不会自动清除资源。例外情况如何知道哪些资源需要清理,哪些资源不需要清理?异常处理程序可以在同一个块中引发和处理,在这种情况下,程序员可以清理处理程序中的相关资源,也可以将其传播到封闭块或调用引发异常的子程序的作用域中的块。Ada 83异常在语义上没有连接到一组需要清理的资源。

异常通常在引发异常的作用域之外声明。如果情况并非如此,则不能在按名称声明异常的作用域之外显式地处理异常,而只能使用异常处理程序中的其他选择来处理异常。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71896557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档