日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言常用的异常处理,C语言中的异常处理

發布時間:2025/4/5 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言常用的异常处理,C语言中的异常处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 前言:

異常處理,對于做面向對象開發的開發者來說是再熟悉不過了,例如在C#中有

try

{

...

}

catch( Exception e){...}

finally{

.....

}

在C++中,我們常常會使用

try{}

...

catch(){}

塊來進行異常處理。

說了那么多,那么到底什么是異常處理呢?

異常處理(又稱為錯誤處理)功能提供了處理程序運行時出現的任何意外或異常情況的方法。

異常處理一般有兩種模型,一種是"終止模型",一種是"恢復模型"

"終止模型":在這種模型中,將假設錯誤非常關鍵,將以致于程序無法返回到異常發生的地方繼續執行.一旦異常被拋出,就表明錯誤已無法挽回,也不能回來繼續執行.

"恢復模型":異常處理程序的工作是修正錯誤,然后重新嘗試調動出問題的方法,并認為的二次能成功. 對于恢復模型,通常希望異常被處理之后能繼續執行程序.在這種情況下,拋出異常更像是對方法的調用--可以在Java里用這種方法進行配置,以得到類似恢復的行為.(也就是說,不是拋出異常,而是調用方法修正錯誤.)或者,把try塊放在while循環里,這樣就可以不斷的進入try塊,直到得到滿意的結果.

二 面向對象中的異常處理

大致了解了什么是異常處理后,由于異常處理在面向對象語言中使用的比較普遍,我們就先以C++為例,做一個關于異常處理的簡單例子:

問題:求兩個數相除的結果。

這里,隱藏這一個錯誤,那就是當除數為0時,會出現,所以,我們得使用異常處理來捕捉這個異常,并拋出異常信息。

具體看代碼:

1?#include?

2?#include?

3?using?namespace?std;

4?class?DivideError:public?exception

5?{

6??public:

7???????????DivideError::DivideError():exception(){}

8??????????const?char*?what(){

9?????????????return?"試圖去除一個值為0的數字";

10?????????}

11

12?};

13?double?quotion(int?numerator,int?denominator)

14?{

15?????if(0==denominator)??????????//當除數為0時,拋出異常16?????throw?DivideError();

17?????return?static_cast(numerator)/denominator;

18?}

19?int?main()

20?{

21?????int?number1;?????????????//第一個數字22?????int?number2;?????????????//第二個數字23?????double?result;

24?????cout<

25?????while(cin>>number1>>number2){

26?????????try{

27?????????????result=quotion(number1,number2);

28?????????????cout<

29

30?????????}?????//end?try31?????????catch(DivideError?&divException){

32?????????????cout<

33?????????????????<

34?????????}

35?????}

36

37?}

38

在這個例子中,我們使用了頭文件中的exception類,并使DivideError類繼承了它,同時重載了虛方法what(),以給出特定的異常信息。

而C#中的異常處理類則封裝的更有全面,里面封裝了常用的異常處理信息,這里就不多說了。

三 C語言中的異常處理

在C語言中異常處理一般有這么幾種方式:

1.使用標準C庫提供了abort()和exit()兩個函數,它們可以強行終止程序的運行,其聲明處于頭文件中。

2.使用assert(斷言)宏調用,位于頭文件中,當程序出錯時,就會引發一個abort()。

3.使用errno全局變量,由C運行時庫函數提供,位于頭文件中。

4.使用goto語句,當出錯時跳轉。

5.使用setjmp,longjmp進行異常處理。

接下來,我們就依次對這幾種方式來看看到底是怎么做的:

我們仍舊以前面處理除數為0的異常為例子。

1.使用exit()函數進行異常終止:

1?#include?

2?#include?

3?double?diva(double?num1,double?num2)?????????//兩數相除函數4?{

5?????double?re;

6?????re=num1/num2;

7?????return?re;

8?}

9?int?main()

10?{

11????double?a,b,result;

12??printf("請輸入第一個數字:");

13???scanf("%lf",&a);

14???printf("請輸入第二個數字:");

15???scanf("%lf",&b);

16???if(0==b)????????????????????????????????//如果除數為0終止程序17???exit(EXIT_FAILURE);

18?result=diva(a,b);

19????printf("相除的結果是:?%.2lf\n",result);

20?return?0;

21?}

其中exit的定義如下:

_CRTIMP void __cdecl __MINGW_NOTHROW?exit?(int) __MINGW_ATTRIB_NORETURN;

exit的函數原型:void exit(int)由此,我們也可以知道EXIT_FAILURE宏應該是一個整數,exit()函數的傳遞參數是兩個宏,一個是剛才看到的EXIT_FAILURE,還有一個是EXIT_SUCCESS從字面就可以看出一個是出錯后強制終止程序,而一個是程序正常結束。他們的定義是:

#define?EXIT_SUCCESS?0

#define?EXIT_FAILURE?1

到此,當出現異常的時候,程序是終止了,但是我們并沒有捕獲到異常信息,要捕獲異常信息,我們可以使用注冊終止函數atexit(),它的原型是這樣的:int atexit(atexit_t func);

具體看如下程序:

1?#include?

2?#include?

3?void?Exception(void)???????????????????????????//注冊終止函數,通過掛接到此函數,捕獲異常信息4?{

5?????printf("試圖去除以一個為0的數字,出現異常!\n");

6?}

7?int?main()

8?{

9????double?a,b,result;

10???printf("請輸入第一個數字:");

11???scanf("%lf",&a);

12???printf("請輸入第二個數字:");

13???scanf("%lf",&b);

14???if(0==b)????????????????????//如果除數為0終止程序?,并掛接到模擬異常捕獲的注冊函數15???{

16

17???atexit(Exception);

18???exit(EXIT_FAILURE);

19???}

20????result=diva(a,b);

21????printf("相除的結果是:?%.2lf\n",result);

22?return?0;

23?}

這里需要注意的是,atexit()函數總是被執行的,就算沒有exit()函數,當程序結束時也會被執行。并且,可以掛接多個注冊函數,按照堆棧結構進行執行。abort()函數與exit()函數類似,當出錯時,能使得程序正常退出,這里就不多說了。

2.使用assert()進行異常處理:

assert()是一個調試程序時經常使用的宏,切記,它不是一個函數,在程序運行時它計算括號內的表達式,如果表達式為FALSE ?(0), ?程序將報告錯誤,并終止執行。如果表達式不為0,則繼續執行后面的語句。這個宏通常原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重后果,同時也便于查找錯誤。

另外需要注意的是:assert只有在Debug版本中才有效,如果編譯為Release版本則被忽略。

我們就前面的問題,使用assert斷言進行異常終止操作:構造可能出現出錯的斷言表達式:assert(number!=0)這樣,當除數為0的時候,表達式就為false,程序報告錯誤,并終止執行。

代碼如下:

代碼

3.使用errno全局變量,進行異常處理:

errno全局變量主要在調式中,當系統API函數發生異常的時候,將errno變量賦予一個整數值,根據查看這個值來推測出錯的原因。

其中的各個整數值都有一個相應的宏定義,表示不同的異常原因:

代碼

這里我們就不以前面的除數為0的例子來進行異常處理了,因為我不知道如何定義自己特定錯誤的errno,如果哪位知道,希望能給出方法。我以一個網上的例子來說明它的使用方法:

代碼

這里試圖打開一個d盤的文件,如果文件不存在,這是查看errno的值,結果是2、

當文件存在時,errno的值為初始值0。然后查看值為2的錯誤信息,在宏定義那邊#define????ENOFILE????????2????/*?No?such?file?or?directory?*/

便知道錯誤的原因了。

4.使用goto語句進行異常處理:

goto語句相信大家都很熟悉,是一個跳轉語句,我們還是以除數為0的例子,來構造一個異常處理的例子:

代碼

5.使用setjmp和longjmp進行異常捕獲與處理:

setjmp和longjmp是非局部跳轉,類似goto跳轉作用,但是goto語句具有局限性,只能在局部進行跳轉,當需要跳轉到非一個函數內的地方時就需要用到setjmp和longjmp。setjmp函數用于保存程序的運行時的堆棧環境,接下來的其它地方,你可以通過調用longjmp函數來恢復先前被保存的程序堆棧環境。異常處理基本方法:

使用setjmp設置一個跳轉點,然后在程序其他地方調用longjmp跳轉到該點(拋出異常).

代碼如下所示:

#include?

#include?

jmp_buf?j;

void?Exception(void)

{

longjmp(j,1);

}

double?diva(double?num1,double?num2)?????????//兩數相除函數?{

double?re;

re=num1/num2;

return?re;

}

int?main()

{

double?a,b,result;

printf("請輸入第一個數字:");

scanf("%lf",&a);

printf("請輸入第二個數字:");

if(setjmp(j)==0)

{

scanf("%lf",&b);

if(0==b)

Exception();

result=diva(a,b);

printf("相除的結果是:?%.2lf\n",result);

}

else

printf("試圖除以一個為0的數字\n");

return?0;

}

四 總結:

除了以上幾種方法之外,另外還有使用信號量等等方法進行異常處理。當然在實際開發中每個人都有各種調式的技巧,而且這文章并不是說明異常處理一定要這樣做,這只是對一般做法的一些總結,也不要亂使用異常處理,如果弄的不好就嚴重影響了程序的效率和結構,就像設計模式一樣,不能胡亂使用。

總結

以上是生活随笔為你收集整理的c语言常用的异常处理,C语言中的异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 嫩草av久久伊人妇女超级a | 国产乱人乱偷精品视频 | 中文在线8资源库 | 免费看成人片 | 日本人体一区 | 欧美日韩综合在线 | 姑娘第5集在线观看免费好剧 | 中文字幕成人在线观看 | 黄色片视频免费观看 | 女性裸体瑜伽无遮挡 | 能免费看黄色的网站 | 91精彩刺激对白 | 精品人妻无码在线 | 亚洲va欧美va国产综合久久 | 久久亚洲精品国产 | av青草 | www.日日日| 天天躁狠狠躁狠狠躁夜夜躁68 | 91亚洲一线产区二线产区 | 午夜精品久久久久久久久 | 亚洲第一免费播放区 | 黑人高潮一区二区三区在线看 | 91精品国产日韩91久久久久久 | 人妻精品一区二区在线 | 91在线播放视频 | 人妻在卧室被老板疯狂进入 | 亚洲欧美激情一区二区三区 | 国产www在线观看 | 亚洲女同志亚洲女同女播放 | 久久狠狠高潮亚洲精品 | 熟女性饥渴一区二区三区 | 欧美大胆a视频 | 色婷婷综合久久久久中文 | 欧美69精品久久久久久不卡 | 无限资源日本好片 | 日韩欧美h| 一区二区日韩精品 | 亚洲国产精彩视频 | 欧美精品v | 国产午夜一级一片免费播放 | 日本人妻一区二区三区 | 小镇姑娘国语版在线观看免费 | 日本中文字幕精品 | 久久免费看片 | 黄色69视频| 一二三四精品 | 超碰在97| 蜜桃视频一区二区三区 | 欧美日韩高清一区二区三区 | 日本一区二区三区精品视频 | 蜜桃成人无码区免费视频网站 | 91网视频| 曰批免费视频播放免费 | 中文亚洲字幕 | 国产成人精品久久 | 国产a级片 | 亚洲精品aⅴ中文字幕乱码 国产精品调教视频 | 久草久热 | 欧美区视频 | 国内自拍偷拍网 | 黄色无毒网站 | 校园春色中文字幕 | 亚洲一区电影在线观看 | 天天爱av| 国产情侣在线视频 | 黄色大全免费观看 | 蜜臀久久精品 | 日韩中文字幕不卡 | 美国黄色a级片 | 涩涩视频在线观看 | 五月婷婷综合色 | 中文字幕日韩无 | 久久综合福利 | 狠狠操夜夜| jizz日本在线 | 欧美日韩一区二区三区在线观看 | 欧美无砖砖区免费 | 色爱综合 | 97国产精品视频 | 日韩理论片在线观看 | 国产嫩草视频 | a级黄色一级片 | 国产高清在线免费 | 久青草免费视频 | 欧美亚洲图片小说 | 国产精品二区一区 | 在线看免费 | 国产一级二级在线观看 | 日韩国产在线播放 | 免费中文字幕日韩 | 亚洲综合中文字幕在线 | 日韩精品视频免费播放 | 初尝人妻少妇中文字幕 | 校园春色欧美 | 丁香八月婷婷 | 蜜臀av性久久久久蜜臀av麻豆 | 国产在线观看你懂的 | 9久久9毛片又大又硬又粗 | 欧美黄色性生活 |