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

rwa*_*ace 3 destructor language-implementation exception ada try-finally

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

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

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

Nik*_*sti 5

问题并不在于异常是否会清理资源,而在于留下声明性作用域(例如子程序体或块语句)是否会清理在该作用域中分配的资源。离开范围的原因是次要问题。执行是通过到达作用域的“末尾”还是通过传播在作用域中引发但未在作用域中处理的异常来离开并不重要。

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

但对于当今被视为“资源”的大多数内容,例如具有非本地访问类型的本地堆分配、打开本地声明的文件等,当离开本地作用域时,Ada 83 不会自动清理此类本地资源分配。对于此类作用域,通常的习惯做法是有一个本地异常处理程序,用于清理资源,然后(如果需要)重新引发异常或引发另一个异常。