exception - Ada 83 异常是否包括资源清理?

标签 exception destructor ada try-finally language-implementation

Ada 83 是最早出现异常的语言之一。 (我想说“第一个”,但我从研究技术史中学到的一件事是,几乎总是有一个更早的 X。)

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

Ada 83 是否有任何由异常以这种方式调用的资源清理功能?还是实现可以直接执行 longjmp?

最佳答案

真正的问题不在于异常是否清理资源,而是离开声明性范围,例如子程序主体或 block 语句,是否清理在该范围内分配的资源。离开范围的原因是次要问题。执行是通过到达范围的“末尾”还是通过传播在范围内引发但未在范围内处理的异常而离开都无关紧要。

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

但是对于大多数今天被认为是“资源”的东西,例如具有非本地访问类型的本地堆分配、打开本地声明的文件等,Ada 83 不会在本地时自动清理此类本地资源分配剩下的范围。正常的习惯用法是这样的范围有一个本地异常处理程序来清理资源,然后(如果需要)重新引发异常或引发另一个异常。

关于exception - Ada 83 异常是否包括资源清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71896557/

相关文章:

java - 更好地理解 Java 概念 : File , 异常处理

python - DeprecationWarning : BaseException. 消息已从 Python 2.6 exception.__class__, exception.message,

c# - 将 catch block 中的 2 个语句合并为一个

delphi - 当对象被销毁时,Delphi 对象字段中的动态数组会自动释放/释放吗?

c++ - 什么时候在构造函数和析构函数中调用 this-> 是安全的

ada 指向局部变量编译和运行时错误的指针

import - Ada:导入不等式运算符 "/="

java - HttpsURLConnection 显示安全警告对话框而不是捕获异常

c++ - 默认参数对象何时销毁?

新项目的艾达?