評估 Catch 區塊的方式 (C++)
C++ 可讓您擲回任何類型的例外狀況,不過,一般建議擲回衍生自 std::exception 的類型。 C++ 例外狀況可由 catch
指定與擲回例外狀況相同的型別的處理常式攔截,或由可以攔截任何類型的例外狀況的處理常式攔截。
如果擲回的例外狀況類型是類別,而該類別同時擁有一個或多個基底類別,則可以使用接受例外狀況類型的基底類別,以及接受例外狀況類型之基底參考的處理常式攔截例外狀況。 請注意,如果是以參考攔截例外狀況,它會繫結程序至實際擲回的例外狀況物件,否則它會是複本 (就如同函式的引數)。
擲回例外狀況時,可能會由下列類型的 catch
處理常式攔截:
可以接受任何類型的處理常式 (使用省略語法)。
接受與例外狀況物件相同類型的處理常式;因為它是複本,
const
而且volatile
會忽略修飾詞。可以接受與例外狀況物件相同類型之參考的處理常式。
接受與例外狀況物件相同型別之 或
volatile
形式的參考const
的處理常式。接受與例外狀況物件相同型別之基類的處理常式;因為它是複本,
const
而且volatile
會忽略修飾詞。catch
基類的處理常式不得在衍生類別的處理常式之前catch
。可以接受與例外狀況物件相同類型的基底類別之參考的處理常式。
接受與例外狀況物件相同類型之基類之 或
volatile
格式之參考const
的處理常式。可以接受指標的處理常式,擲回的指標物件可以透過標準指標轉換規則轉換成該指標。
處理常式出現的順序 catch
很重要,因為特定 try
區塊的處理常式會依其外觀順序進行檢查。 例如,將基底類別的處理常式放在衍生類別的處理常式前面就是錯誤的範例。 找到相符 catch
的處理常式之後,不會檢查後續的處理常式。 因此,省略號 catch
處理常式必須是其 try
區塊的最後一個處理常式。 例如:
// ...
try
{
// ...
}
catch( ... )
{
// Handle exception here.
}
// Error: the next two handlers are never examined.
catch( const char * str )
{
cout << "Caught exception: " << str << endl;
}
catch( CExcptClass E )
{
// Handle CExcptClass exception here.
}
在此範例中,省略號 catch
處理常式是唯一檢查的處理常式。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應