C++ 運行庫處理異常主要依靠 std::exception
類及其派生類。當程序中發生異常時,C++ 運行庫會拋出相應的異常對象,然后通過一系列的 catch 塊來捕獲和處理這些異常。
以下是 C++ 異常處理的基本步驟:
throw
關鍵字拋出一個異常對象。通常,我們會拋出 std::exception
的派生類,如 std::runtime_error
、std::out_of_range
等,以便提供更多關于異常的信息。try {
// 可能拋出異常的代碼
throw std::runtime_error("An error occurred");
} catch (const std::exception& e) {
// 處理異常的代碼
}
try
和 catch
塊來捕獲和處理異常。try
塊包含可能拋出異常的代碼,而 catch
塊用于捕獲并處理異常。當 try
塊中的代碼拋出異常時,程序會立即跳轉到與該異常類型匹配的 catch
塊。try {
// 可能拋出異常的代碼
} catch (const std::exception& e) {
// 處理異常的代碼
} catch (const std::out_of_range& e) {
// 處理特定類型的異常
}
catch
塊中,可以選擇處理異常,或者重新拋出一個新的異常。如果你希望將異常傳遞給上層調用者處理,可以使用 throw;
語句重新拋出當前捕獲的異常。try {
// 可能拋出異常的代碼
} catch (const std::exception& e) {
// 處理異常的代碼
throw; // 重新拋出當前異常
}
noexcept
關鍵字,用于指定函數不會拋出任何異常。從 C++17 開始,異常規范已被廢棄。// C++11 之前的異常規范
void foo() noexcept(false);
// C++11 及以后的 noexcept 關鍵字
void foo() noexcept;
try-catch
塊中的異常被拋出時,C++ 運行庫會按照后進先出(LIFO)的順序展開棧,直到找到與異常類型匹配的 catch
塊。在這個過程中,所有被 catch
塊捕獲的局部變量會被銷毀,以防止資源泄漏。總之,C++ 運行庫通過 std::exception
類及其派生類來處理異常,并提供了 try-catch
機制來捕獲和處理異常。在編寫程序時,我們應該盡量使用異常來處理錯誤情況,而不是使用返回碼,以提高代碼的可讀性和可維護性。