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






