try、throw 和 catch 陳述式 (C++)

若要在 C++ 中實作例外狀況處理,請使用 trythrowcatch 運算式。

首先,使用 try 區塊來封入一或多個可能會擲回例外狀況的語句。

運算式 throw 表示例外狀況通常是在區塊中 try 發生錯誤。 您可以使用任何類型的 物件作為運算式的操作 throw 數。 這個物件通常用來傳達與錯誤有關的資訊。 在大部分情況下,我們建議您使用 類別 std::exception 或標準程式庫中定義的其中一個衍生類別。 如果其中一項不適合,建議您從 std::exception 衍生自己的例外狀況類別。

若要處理可能擲回的例外狀況,請緊接在區塊之後 try 實作一或多個 catch 區塊。 每個 catch 區塊都會指定它可以處理的例外狀況類型。

此範例顯示 try 區塊及其處理常式。 假設 GetNetworkResource() 透過網路連線取得資料,且兩個例外狀況類型是衍生自 std::exception 的使用者定義類別。 請注意,語句中的 catch 參考會攔截 const 例外狀況。 建議您依照值擲回例外狀況並依 const 參考攔截這些例外狀況。

範例

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

備註

子句之後的程式 try 代碼是程式碼的受防護區段。 運算式 throw 擲回 ,也就是引發例外狀況。 子句後面的 catch 程式碼區塊是例外狀況處理常式。 這是攔截與 運算式中型別相容時所擲回例外狀況的 throwcatch 處理常式 。 如需管理區塊中 catch 類型比對的規則清單,請參閱 如何評估 Catch 區塊。 catch如果 語句指定省略號 (...) 而不是類型,區塊會 catch 處理每個例外狀況類型。 當您使用 /EHa 選項進行編譯時,可能包括 C 結構化例外狀況和系統產生的或應用程式產生的非同步例外狀況,例如記憶體保護、除以零和浮點違規。 因為 catch 區塊會以程式方式處理,才能尋找相符的類型,因此省略號處理常式必須是相關聯 try 區塊的最後一個處理常式。 請小心使用 catch(...) ;除非 catch 區塊知道如何處理攔截的特定例外狀況,否則不允許程式繼續。 通常,catch(...) 區塊的用途是在程式停止執行之前記錄錯誤和執行特殊清除。

throw沒有運算元的運算式會重新擲回目前正在處理的例外狀況。 建議您在重新擲回例外狀況時使用此表單,因為這會保留原始例外狀況的多型類型資訊。 這類運算式應該只用于 catch 處理常式或從 catch 處理常式呼叫的函式中。 重新擲回的例外狀況物件是原始的例外狀況物件,而不是複本。

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

另請參閱

例外狀況和錯誤處理的新式 C++ 最佳做法
關鍵字
未處理的 C++ 例外狀況
__uncaught_exception