本文參照於狄泰軟體學院——《c++深度剖析課程》
之前我們分析了c語言中異常處理的方式,基本沒有好的解決方案。那麼c++中會如何優化c語言對異常的處理的缺陷呢?c++內建了異常處理的語法元素try…catch…
try語句處理正常**邏輯
catch語句處理異常情況
try語句中的異常由對應的catch語句處理
try
catch
疑問:這種方式跟c語言的if…else…處理方式有什麼區別嗎?c++通過throw語句丟擲異常資訊
throw丟擲的異常必須被catch處理
未被處理的異常會順著函式呼叫棧向上傳播,直到被處理為止,否則程式將停止執行。
示例**:c++異常處理初探
#include
#include
using
namespace
std;
double divide(double a, double b)
else
return ret;
}int main(int argc, char *argv)
catch(...)
return
0;}
分析:
1. 相對於c語言的處理方式,c++異常的處理方式更加直觀了。
a) 不需要增加函式引數
b) 不需要返回異常資訊
c) 不需要使用全域性變數
catch(…)用於處理所有型別的異常。
問題:c語言可以處理多個異常情況,那麼c++的try…catch有這樣的處理方式嗎?示例**:c++異常處理規則
#include
#include
using
namespace
std;
void demo1()
catch(char c)
catch(short c)
}void demo2()
int main(int argc, char *argv)
catch(double d)
trycatch(char* s)
catch(const
char* cs)
catch(string ss)
catch(...)
}
輸出結果:分析:catch(double d)
catch(string ss)
1、 當函式丟擲(throw)異常時,該函式結束執行,相當於c語言中的return。
2、 當丟擲的異常找不到相應的catche時,未被處理的異常會順著函式呼叫棧向上傳播,直到被處理為止,否則程式將停止執行。
這就是demo1() 一進入函式就丟擲異常throw 3.14;馬上結束了該函式的執行,返回到main函式中尋找相應的catch。如果沒有相應的catch,程式就會被終止。
3、 catch 語句可以定義具體處理的異常型別
4、 不同型別的異常由不同的catch 語句負責處理,並且任何異常都只能**獲(catch )一次
5、try 語句中可以丟擲任何型別的異常
6、catch (…)用於處理所有型別的異常
這就是demo2() ,丟擲string型別的異常。在主函式中只會找到相應的catch(string ss)進行執行。對於後面的處理任何異常的catch(…)視而不見。
異常丟擲後,至上而下嚴格匹配每乙個catche語句處理的型別,不進行任何的型別轉換。並且只會執行一次。如果找不到相應的catch。則順著函式呼叫棧向上傳播,知道被處理為止,否則程式將停止執行
問題:如果我們在catch語句塊中丟擲異常。那麼會怎麼樣?為什麼需要這麼做?從上面我們的分析其實很容易知道,當throw時,就會停止執行該函式,相當於c語言中的return。
那麼,在catch中丟擲的異常必然需要在外層的try…catch…中捕獲。
但是,我們關心的是:為什麼要在catch中丟擲異常,為什麼不直接處理,這樣不是多此一舉嗎?
原因是,在實際工程開發中,我們常常會使用第三方的庫。而我們也有自己的私有庫。
當然我們編寫的**風格及編碼要求必須按照我們自己規定的編寫。
但對於我們使用者來說,第三方庫是不可見的,也就是不可修改的。
那麼當我們**風格和編碼要求與第三方庫相異時,也就是第三方庫丟擲的異常型別不適合我們時,我們就需要多加一層try…catch…進行對第三方庫的封裝,重新丟擲異常,而這個異常的型別就能符合我們自己的編碼要求了。
示例**:異常的重新解釋
/*
假設: 當前的函式式第三方庫中的函式,因此,我們無法修改源**
函式名: void func(int i)
丟擲異常的型別: int
-1 ==》 引數異常
-2 ==》 執行異常
-3 ==》 超時異常
*/void func(int i)
if( i > 100 )
if( i == 11 )
cout
<< "run func..."
<< endl;
}void myfunc(int i)
catch(int i)
}}int main(int argc, char *argv)
catch(const
char* cs)
return
0;}
C 中的異常
一,異常的推演 1.函式與異常 平時我們在函式中出現異常情況時通常通過return終止函式並返回乙個值,然後在函式上層來獲取值並判斷是什麼異常情況。因為函式是棧結構的,所以return的時候是通過棧結構逐步往上的,不能夠跨函式直接丟擲,不方便。所以c 推出了異常機制,通過異常機制我們可以輕鬆的捕獲要...
c 中的異常
乙個簡單的例子 include using namespace std double division int a,int b return a b int main catch const char msg return 0 上面的const char 異常型別也可以是任何型別,比如double,...
C 中的異常
傳統的異常處理方式 1 終止程式,比如assert 2 返回錯誤碼,需要程式設計師去查對應的錯誤碼 3 c標準庫中setjmp和longjmp組合 異常是一種處理錯誤的方式,當函式發現自己無法處理的錯誤就可以丟擲異常,讓函式的呼叫者來處理這個錯誤 throw 用throw丟擲異常 catch 用ca...