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
會擲回 ,也就是引發例外狀況。 子句後面的 catch
程式代碼區塊是例外狀況處理程式。 這是攔截與表達式中型別相容時所擲回例外狀況的throw
catch
處理程式。 如需管理區塊中 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