共用方式為


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

若要在 C++ 中實作例外狀況處理,您可以使用 try、throw 和 catch 運算式。

首先,使用 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 運算式會「擲回」(Throw) 例外狀況,也就是引發例外狀況。 catch 子句之後的程式碼區塊是例外狀況處理常式。 如果 throw 和 catch 運算式中的類型相容,這個處理常式會「攔截」(Catch) 所擲出的例外狀況。 如需 catch 區塊中管理類型相符之規則的清單,請參閱評估 Catch 區塊的方式 (C++)。 如果 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++ 關鍵字

未處理的 C++ 例外狀況

__uncaught_exception