[英]How does the C++ runtime determine the type of a thrown exception?
如果我執行以下操作,運行時如何確定拋出異常的類型? 它是否使用RTTI?
try
{
dostuff(); // throws something
}
catch(int e)
{
// ..
}
catch (const char * e)
{
// ..
}
catch (const myexceptiontype * e)
{
// ..
}
catch (myexceptiontype e) // is this the same as the previous handler?
{
// ..
}
與其他問題中提出的問題不同,這個問題的答案可以完全通過標准來回答。 這是規則
處理程序是E類型的異常對象的匹配項
- 處理程序的類型為cv T或cv T&,E和T的類型相同(忽略頂級cv限定符),或者
- 處理程序的類型為cv T或cv T&T是E的明確公共基類,或
- 處理程序的類型為cv1 T * cv2,E是一種指針類型,可以通過其中一個或兩個轉換為處理程序的類型
- 標准指針轉換(4.10),不涉及到指向私有或受保護或模糊類的指針的轉換
- 資格轉換
[注意:throw-expression是整數類型的整數常量表達式,其計算結果為零,與指針類型的處理程序不匹配; 也就是說,空指針常量轉換(4.10,4.11)不適用。 ]
由於我不太確定你對標准的理解水平,我會留下無法解釋的,並按你的要求回答。
關於它是否使用RTTI - 好吧,拋出的異常對象的類型是你移交給throw
語句的表達式的靜態類型 (前一段時間,我很高興在GCC中解決這個問題)。 所以它不需要做運行時類型識別。 因此,使用g++
,在throw
出現的那一側,它會移交一個std::type_info
對象,表示異常對象的類型,對象本身和析構函數。
然后拋出它,並搜索幀以尋找匹配的處理程序。 使用大表(位於名為.eh_frame
的部分)中找到的信息,並使用返回地址,它查看哪個函數負責下一次處理。 該函數將安裝一個個性例程,以確定它是否可以處理異常。 整個過程在由@PaV鏈接的Itanium C ++ ABI(由G ++實現)中描述(當然更詳細)。
所以,總結一下
myexceptiontype e
和
const myexceptiontype *e
當然,不要處理相同的類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.