C++ 可讓您擲回任何類型的例外狀況,不過,一般建議擲回衍生自 std::exception 的類型。 C++例外狀況可由 catch 指定與擲回例外狀況相同的型別的處理程序攔截,或由可以攔截任何類型的例外狀況的處理程序攔截。
如果擲回的例外狀況類型是類別,而該類別同時擁有一個或多個基底類別,則可以使用接受例外狀況類型的基底類別,以及接受例外狀況類型之基底參考的處理常式攔截例外狀況。 請注意,如果是以參考攔截例外狀況,它會繫結程序至實際擲回的例外狀況物件,否則它會是複本 (就如同函式的引數)。
擲回例外狀況時,可能會由下列類型的 catch 處理程序攔截:
可以接受任何類型的處理常式 (使用省略語法)。
接受與例外狀況物件相同類型的處理程式;因為它是複本,
const而且volatile會忽略修飾詞。可以接受與例外狀況物件相同類型之參考的處理常式。
接受與例外狀況物件相同型別之 或
const形式的參考volatile的處理程式。接受與例外狀況物件相同型別之基類的處理程式;因為它是複本,
const而且volatile會忽略修飾詞。catch基類的處理程式不得在衍生類別的處理程式之前catch。可以接受與例外狀況物件相同類型的基底類別之參考的處理常式。
接受與例外狀況物件相同類型之基類之 或
const格式之參考volatile的處理程式。可以接受指標的處理常式,擲回的指標物件可以透過標準指標轉換規則轉換成該指標。
處理程式出現的順序 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 處理程式是唯一檢查的處理程式。