共用方式為


評估 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 處理常式是唯一檢查的處理常式。

另請參閱

例外狀況和錯誤處理的新式 C++ 最佳做法