異常 C 中的異常

2021-08-20 10:02:47 字數 3135 閱讀 6907

本文參照於狄泰軟體學院——《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...