C++ 標(biāo)準(zhǔn)異常類主要包括 std::exception
和它的派生類
使用標(biāo)準(zhǔn)異常類:盡量使用 C++ 標(biāo)準(zhǔn)庫提供的異常類,如 std::runtime_error
、std::out_of_range
、std::invalid_argument
等。這些異常類已經(jīng)包含了有關(guān)異常的通用信息,如錯誤消息和異常類型。
捕獲異常時,盡量捕獲具體的異常類型,而不是捕獲所有異常。這樣可以讓你更準(zhǔn)確地處理不同類型的異常,并在必要時向上層代碼拋出異常。例如:
try {
// 可能拋出異常的代碼
} catch (const std::runtime_error& e) {
// 處理 runtime_error 類型的異常
} catch (const std::out_of_range& e) {
// 處理 out_of_range 類型的異常
} catch (...) {
// 處理其他未知類型的異常
}
std::exception
或其子類,并實現(xiàn) what()
成員函數(shù)。what()
函數(shù)應(yīng)返回一個描述異常的字符串,可以使用 std::runtime_error
的構(gòu)造函數(shù)來設(shè)置錯誤消息。例如:#include <stdexcept>
#include <string>
class MyCustomException : public std::runtime_error {
public:
MyCustomException(const std::string& message)
: std::runtime_error(message) {}
};
noexcept
關(guān)鍵字來替代異常規(guī)范。例如:// C++98/03 風(fēng)格的異常規(guī)范
void myFunction() throw(std::runtime_error, std::out_of_range);
// C++11 及以后的風(fēng)格
void myFunction() noexcept;
noexcept
關(guān)鍵字:在 C++11 及以后的版本中,可以使用 noexcept
關(guān)鍵字來標(biāo)記函數(shù)不會拋出異常。這有助于提高代碼的性能,并讓編譯器進(jìn)行更有效的優(yōu)化。例如:void myFunction() noexcept {
// 不可能拋出異常的代碼
}
try-catch
塊處理異常:在可能出現(xiàn)異常的代碼周圍使用 try-catch
塊來捕獲和處理異常。這樣可以確保程序在遇到異常時能夠優(yōu)雅地處理錯誤,而不是崩潰。例如: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
可以捕獲當(dāng)前線程中的異常,并將其存儲在 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;
}
遵循這些最佳實踐,可以幫助你編寫更健壯、可維護(hù)的 C++ 代碼。