Ada 83是最早有例外情况的语言之一。(我想说“第一次”,但我从研究技术历史中学到的一件事是,几乎总是有一个较早的X。)
从实现的角度来看,实现异常最复杂的部分是它们与资源清理的交互( C++中的析构函数,最后是Java中的destructors);当抛出异常时,在退出每个动态嵌套的范围时,需要在退出时运行资源清理代码。
Ada 83是否有例外以这种方式调用的资源清理功能?或者,实现可以直接执行长时间操作吗?
发布于 2022-04-17 06:03:42
问题不在于异常是否真正清理资源,而是是否保留声明作用域(例如子程序体或块语句)清理在该范围内分配的资源。离开范围的原因是次要的问题。无论执行是通过到达作用域的“结束”还是传播在作用域中引发但不在作用域中处理的异常,这都无关紧要。
Ada 83对“资源”的概念非常有限,但确实试图清理这些资源。当保留作用域时,带作用域的所有局部变量的堆栈框架将被移除。如果作用域声明了一个本地访问类型,特别是如果声明有一个Storage_Size子句,则在保留该范围时(尽管我认为这不是一个严格的要求,而且有些编译器可能没有实现),可以删除该访问类型的动态分配对象的整个“集合”(解除分配,释放)。如果作用域是某些任务的主(“所有者”),则任务必须终止才能保留作用域(但程序员有责任以某种方式通知应该终止的任务,或中止任务)。
但是对于今天被认为是“资源”的大部分内容,例如具有非本地访问类型的本地堆分配、打开本地声明的文件等等,Ada 83不会在保留本地范围时自动清理这些本地资源分配。通常的成语是这样的作用域有一个本地异常处理程序来清理资源,然后(如果需要的话)重新引发异常或引发另一个异常。
发布于 2022-04-16 20:15:29
允许在引发异常之前执行资源清理,但Ada 83异常不会自动清除资源。例外情况如何知道哪些资源需要清理,哪些资源不需要清理?异常处理程序可以在同一个块中引发和处理,在这种情况下,程序员可以清理处理程序中的相关资源,也可以将其传播到封闭块或调用引发异常的子程序的作用域中的块。Ada 83异常在语义上没有连接到一组需要清理的资源。
异常通常在引发异常的作用域之外声明。如果情况并非如此,则不能在按名称声明异常的作用域之外显式地处理异常,而只能使用异常处理程序中的其他选择来处理异常。
https://stackoverflow.com/questions/71896557
复制相似问题