C++ 標準異常類主要包括 std::exception
和它的派生類
使用標準異常類:盡量使用 C++ 標準庫提供的異常類,如 std::runtime_error
、std::out_of_range
、std::invalid_argument
等。這些異常類已經包含了有關異常的通用信息,如錯誤消息和異常類型。
捕獲異常時,盡量捕獲具體的異常類型,而不是捕獲所有異常。這樣可以讓你更準確地處理不同類型的異常,并在必要時向上層代碼拋出異常。例如:
try {
// 可能拋出異常的代碼
} catch (const std::runtime_error& e) {
// 處理 runtime_error 類型的異常
} catch (const std::out_of_range& e) {
// 處理 out_of_range 類型的異常
} catch (...) {
// 處理其他未知類型的異常
}
std::exception
或其子類,并實現 what()
成員函數。what()
函數應返回一個描述異常的字符串,可以使用 std::runtime_error
的構造函數來設置錯誤消息。例如:#include <stdexcept>
#include <string>
class MyCustomException : public std::runtime_error {
public:
MyCustomException(const std::string& message)
: std::runtime_error(message) {}
};
noexcept
關鍵字來替代異常規范。例如:// C++98/03 風格的異常規范
void myFunction() throw(std::runtime_error, std::out_of_range);
// C++11 及以后的風格
void myFunction() noexcept;
noexcept
關鍵字:在 C++11 及以后的版本中,可以使用 noexcept
關鍵字來標記函數不會拋出異常。這有助于提高代碼的性能,并讓編譯器進行更有效的優化。例如:void myFunction() noexcept {
// 不可能拋出異常的代碼
}
try-catch
塊處理異常:在可能出現異常的代碼周圍使用 try-catch
塊來捕獲和處理異常。這樣可以確保程序在遇到異常時能夠優雅地處理錯誤,而不是崩潰。例如:try {
// 可能拋出異常的代碼
} catch (const std::exception& e) {
// 處理異常的代碼
}
std::exception_ptr
和 std::current_exception
:在 C++11 及以后的版本中,可以使用 std::exception_ptr
和 std::current_exception
來處理異常。std::exception_ptr
是一個指向異常對象的指針,可以在不同的線程之間傳遞異常。std::current_exception
可以捕獲當前線程中的異常,并將其存儲在 std::exception_ptr
中。例如:#include <exception>
#include <iostream>
void handleException(const std::exception_ptr& eptr) {
try {
std::rethrow_exception(eptr);
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
}
int main() {
std::exception_ptr eptr = nullptr;
try {
// 可能拋出異常的代碼
throw std::runtime_error("An error occurred");
} catch (...) {
eptr = std::current_exception();
}
handleException(eptr);
return 0;
}
遵循這些最佳實踐,可以幫助你編寫更健壯、可維護的 C++ 代碼。