c++++ 函數異常處理中常見的陷阱:避免在異常處理塊中返回局部變量引用或指針,以免指向無效內存。異常處理塊中不要重復拋出異常,以免覆蓋原始異常信息。謹慎使用 noexcept 指定符,確保函數確實不會拋出異常。使用智能指針和異常規范,以提高安全性并避免指針懸空問題。
C++ 函數異常處理中的常見陷阱
實戰案例
假設有一個函數 doSomething(),它可能會拋出 MyException 異常:
void doSomething() {
if (condition) {
throw MyException();
}
// 其他代碼
}
登錄后復制
陷阱 1:在異常處理塊中返回引用
問題:如果在異常處理塊中返回一個局部變量的引用,當函數退出時,該引用將指向無效內存。
代碼示例:
string& getSomething() {
try {
string s = "Hello";
return s; // 引用局部變量 s
} catch (exception& e) {
// 處理異常
}
}
登錄后復制
陷阱 2:在異常處理塊中返回指針
問題:與陷阱 1 類似,如果在異常處理塊中返回一個局部變量的指針,當函數退出時,該指針將指向無效內存。
代碼示例:
int* getSomething() {
int n;
try {
n = 10;
return &n; // 返回局部變量 n 的指針
} catch (exception& e) {
// 處理異常
}
}
登錄后復制
陷阱 3:重復拋出異常
問題:如果在異常處理塊中再次拋出另一個異常,原始異常的信息將被覆蓋。
代碼示例:
void doSomething() {
try {
throw MyException();
} catch (MyException& e) {
throw logic_error("New error"); // 重新拋出另一個異常
}
}
登錄后復制
陷阱 4:濫用 noexcept
問題:如果函數簽名帶有 noexcept 指定符,但實際上可能會拋出異常,則程序可能會崩潰。
代碼示例:
void myNoexceptFunction() noexcept {
throw MyException();
}
登錄后復制
預防措施
使用引用和指針時要小心:在異常處理塊中避免返回局部變量的引用或指針。
不要重復拋出異常:在異常處理塊中,僅處理原始異常,避免再次拋出異常。
謹慎使用 noexcept:僅在函數確實不會拋出任何異常時才使用 noexcept。
使用智能指針:使用像 std::shared_ptr 這樣的智能指針來避免指針懸空問題。
使用異常規范:在函數簽名中指定可能的異常類型,以提供額外的安全檢查。






