異常處理與RTTI

2021-08-11 12:28:34 字數 912 閱讀 3307

大家都知道好的異常處理是很難的。原因很多,在每個「生命週期」的異常層中:很難編寫異常安全的**,可能會從意想不到的地方丟擲乙個異常(雙關語!),理解糟糕的異常層次結構可能會很複雜,很慢,因為大量的巫術發生在引擎蓋下,這是很危險的,因為不恰當地丟擲乙個異常可能會呼叫不可原諒的std :: terminate。儘管任何乙個可能不得不與「特殊」計畫作鬥爭的人都可能知道這一點,但這個混亂的原因並不是廣泛的知識。

1.當我們編寫乙個throw語句時,編譯器會將它翻譯成一對呼叫libstdc ++函式的函式來分配異常,然後通過呼叫libstdc來啟動堆疊展開過程。

2.對於每個catch語句,編譯器會在方法的主體之後編寫一些特殊的資訊,這個方法可以捕獲的異常表和乙個清理表(稍後更多的清理表)。

3.當解捲器通過堆疊時,它將呼叫由libstdc ++(稱為個性化例程)提供的特殊函式,該函式檢查堆疊中的每個函式都可以捕獲哪些異常。

4.如果找不到匹配的catch,則呼叫std :: terminate。

5.如果找到乙個匹配的catch,那麼開卷器現在再次在棧頂開始。

6.當開卷機第二次通過堆疊時,它會要求個性例程對這個方法進行清理。

7.個性例程將檢查當前方法的清理表。如果有任何清理操作要執行,它將跳轉到當前的堆疊框架並執行清理**。這將為當前作用域中分配的每個物件執行析構函式。

8.一旦解捲器到達堆疊中可以處理異常的幀,它就會跳入正確的catch語句。

9.在完成catch語句的執行之後,清理函式將被呼叫以釋放為異常保留的記憶體。

這看起來相當複雜,我們還沒有開始。這只是對處理例外所需的所有複雜性的簡短和不準確的描述。——原文

rtti 是「runtime type information」的縮寫,意思是:執行時型別資訊。它提供了執行時確定物件型別的方法。

來自

異常處理 try與except處理異常語句

def convert numbers s try return int s except valueerror return nonetry except介紹 與其他語言相同,在python中,try except語句主要是用於處理程式正常執行過程中出現的一些異常情況,如語法錯 python作為指...

Oracle PlSql Form 異常與處理

no data found 當 sql 游標返回 0 行時 sql notfound too many rows 當 select into語句返回多行時 invalid number 未能將 sql語句中字串成功轉換成數字 zero divide 執行了除以0 操作 cursor already ...

錯誤與異常處理

內部錯誤 程式設計師通常無能為力,一旦發生,想辦法讓程式優雅的結束 異常 你自己程式導致的問題,可以捕獲 可以處理 異常 程式執行中的非正常事件,程式無法再按預想的流程執行 將錯誤資訊傳遞給上層呼叫者,並報告 案發現場 的資訊 執行時異常,是程式 源 中引入的故障所造成的 非執行時異常,是程式設計師...