c++++ 成員函數中錯誤處理機制有錯誤碼、斷言及異常機制。錯誤碼直接返回錯誤值;斷言檢查假設條件,不成立則拋出異常;異常捕獲嚴重錯誤,通過 try-catch 塊處理。實戰案例中,vector 類的 push_back() 函數在容量不足時拋出 std::bad_alloc 異常,使用者可通過 try-catch 捕獲并處理異常。
C++ 成員函數詳解:對象方法的錯誤處理與異常機制
C++ 中的對象方法(成員函數)對于處理復雜業務邏輯和錯誤條件至關重要。本篇文章將深入探討成員函數中錯誤處理和異常機制的用法,并提供實戰案例進行說明。
錯誤處理機制
錯誤碼
最直接的錯誤處理方法是使用錯誤碼。錯誤碼可以是整數或自定義枚舉值,表示特定錯誤條件。在成員函數中,可以通過設置 errno
變量來返回錯誤碼:
int MyFunction() { if (... /* 發生錯誤 */) { errno = EINVAL; // 設置錯誤碼為無效參數 return -1; // 返回錯誤指示符 } // ... 其它代碼 }
登錄后復制
斷言
斷言用于檢查程序中的假設條件。如果條件不成立,則拋出一個異常(稍后討論)。在成員函數中,可以使用 assert()
宏來實現斷言:
void MyOtherFunction() { assert(ptr != nullptr); // 檢查指針是否為 nullptr // ... 其它代碼 }
登錄后復制
異常機制
異常是處理嚴重錯誤條件的強大機制。異常可以將執行從發生錯誤的位置傳遞到指定的位置。在 C++ 中,異常的語法如下:
try { // 可能發生異常的代碼 } catch (exceptionType1& e) { // 處理 exceptionType1 類型異常 } catch (exceptionType2& e) { // 處理 exceptionType2 類型異常 } catch (...) { // 處理所有類型異常 }
登錄后復制
拋出異常
在成員函數中,可以通過使用 throw
關鍵字拋出異常。異常可以是標準庫中的 std::exception
及其子類,也可以是自定義異常類型:
void MyThrowingFunction() { if (... /* 發生嚴重錯誤 */) { throw std::runtime_error("嚴重錯誤!"); } // ... 其它代碼 }
登錄后復制
捕獲異常
可以通過在成員函數的 try-catch
塊中捕獲異常。捕獲的異常對象可以通過引用傳遞給 catch
子句:
void MyCatchingFunction() { try { MyThrowingFunction(); } catch (std::runtime_error& e) { // 處理 std::runtime_error 類型的異常 } catch (...) { // 處理所有類型異常 } }
登錄后復制
實戰案例
假設有一個 Vector
類,其中包含一個成員函數 push_back()
,該函數將元素添加到向量尾部。如果添加到向量的元素數量超過了預分配的容量,則 push_back()
函數應該拋出 std::bad_alloc
異常。
class Vector { public: void push_back(int element) { try { // 嘗試添加元素 // 如果容量不足,會拋出 std::bad_alloc 異常 elements.push_back(element); } catch (std::bad_alloc& e) { // 捕獲并重新拋出 std::bad_alloc 異常 throw; } } private: std::vector<int> elements; // 使用標準庫的 std::vector 作為底層存儲 };
登錄后復制
在使用 Vector
類時,可以如下方式捕獲 push_back()
函數拋出的異常:
int main() { Vector v; try { // 嘗試向向量添加過多元素,導致容量不足 for (int i = 0; i < 1000000; i++) { v.push_back(i); } } catch (std::bad_alloc& e) { // 捕獲 std::bad_alloc 異常并處理 std::cout << "錯誤:容量不足!" << std::endl; return 1; } return 0; }
登錄后復制