Ada 83 是最早出現例外的語言之一。(我想說“第一個”,但我從研究技術史中學到的一件事是,幾乎總是有一個更早的 X。)
從實作的角度來看,實作例外最復雜的部分是它們與資源清理的互動(C 中的解構式,Java 中的 try-finally 等);當拋出例外時,需要在退出每個動態嵌套范圍時運行資源清理代碼。
Ada 83 是否有任何以這種方式被例外呼叫的資源清理功能?或者實作可以直接做一個longjmp嗎?
uj5u.com熱心網友回復:
問題不在于例外是否清理資源,而在于離開宣告性范圍(例如子程式主體或塊陳述句)是否清理在該范圍內分配的資源。離開范圍的原因是次要問題。執行是通過到達范圍的“結束”還是通過傳播在范圍內引發但未在范圍內處理的例外離開并不重要。
Ada 83 的“資源”概念非常有限,但確實嘗試清理這些資源。當一個作用域離開時,帶有該作用域所有區域變數的堆疊幀將被洗掉。如果范圍宣告了本地訪問型別,特別是如果宣告具有 Storage_Size 子句,則在離開范圍時,可能會洗掉(釋放、釋放)該訪問型別的動態分配物件的整個“集合”(盡管我認為這不是一個嚴格的要求,一些編譯器可能沒有實作它)。如果范圍是某些任務的主人(“所有者”),則任務必須在離開范圍之前終止(但程式員負責以某種方式通知任務它們應該終止,或中止任務)。
但是對于今天被認為是“資源”的大部分內容,例如具有非本地訪問型別的本地堆分配、打開本地宣告的檔案等,Ada 83 在離開本地范圍時不會自動清理此類本地資源分配. 正常的習慣用法是讓此類范圍有一個本地例外處理程式來清理資源,然后(如果需要)重新引發例外或引發另一個例外。
uj5u.com熱心網友回復:
允許在引發例外之前執行資源清理作為一個步驟,但 Ada 83 例外不會自動清理資源。例外如何知道要清理哪些資源以及不清理哪些資源?例外處理程式可以在同一個塊中引發和處理,在這種情況下,程式員可以清理處理程式中的相關資源,或者可以將其傳播到封閉塊或呼叫引發例外的子程式的范圍內的塊. Ada 83 例外在語意上與一組需要清理的資源沒有關聯。
例外通常在引發它的范圍之外宣告。如果不是這樣,則無法在按名稱宣告的范圍之外顯式處理例外,并且只能使用例外處理程式中的“其他”選項來處理。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/458703.html
下一篇:多次嘗試塊
