簡體   English   中英

C ++運行時如何確定拋出異常的類型?

[英]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?
{
  // ..
}

也可以看看:

如何實現C ++異常處理運行時?

與其他問題中提出的問題不同,這個問題的答案可以完全通過標准來回答。 這是規則

處理程序是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

當然,不要處理相同的類型。

沒有實施規范。 實現必須遵循標准,並且對其實現方式沒有限制。 並且有一個以上的實現,即使對於一個編譯器也是如此。

您可以在此處閱讀其中一個此類實現的示例:

Itanium C ++ ABI:異常處理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM