日韩性视频-久久久蜜桃-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一区二区 | 木下凛凛子av一区二区三区 | 法国伦理少妇愉情 | 一区在线不卡 | 日韩激情视频 | 肥臀浪妇太爽了快点再快点 | 国产一区二区在线视频观看 | 欧美精品极品 | 51精品 | 天天色成人网 | 最近中文字幕在线免费观看 | 黑人精品一区二区三区不 | 国产精品丝袜一区二区 | 色翁荡息又大又硬又粗又爽 | 伊人春色视频 | 成人av番号网 | 亚洲手机在线观看 | 国产九区 | 欧美一级性视频 | 久操视频精品 | 超薄肉色丝袜一二三 | 伊人黄色片 | 亚洲天堂网在线视频 | 欧美日韩免费在线 | 懂色aⅴ一区二区三区免费 国产精品99在线观看 | 久久亚洲综合 | 青草热视频 | 91精品色 | 奇米影视av | 国产色婷婷一区二区三区竹菊影视 | 少妇太紧太爽又黄又硬又爽小说 | 亚洲av无码国产精品麻豆天美 | 免费观看理伦片在线播放视频软件 | 奇米婷婷 | 美女大黄网站 | 美国成人免费视频 | 国产精品丝袜在线观看 | 5个黑人躁我一个视频 | 狠狠爱综合 | 日韩欧美一区二区三区四区五区 | 总受合集lunjian双性h | 6680新视觉电影免费观看 | 无套爆插| 91国内揄拍国内精品对白 | 亚洲区精品 | 荫蒂被男人添免费视频 | 国产女人18毛片水18精 | 国产农村熟妇videos | 性激烈视频在线观看 | 国产成人欧美一区二区三区的 | 国产在线不卡 | 九九久久精品视频 | 中文字幕激情视频 | 视频在线观看一区二区三区 | 亚洲黄片一区二区三区 | 熟妇高潮一区二区 | 中文字幕理论片 | 九七av| 深爱激情av | 在线亚洲网站 | 国产精品夫妻自拍 | 日本最新中文字幕 | 欧美一区二区最爽乱淫视频免费看 | 99久久香蕉| 免费在线看黄色片 | 爱情岛论坛永久入口 | 日本黄色xxxxx | 久久大香焦 | 日韩av线 | 美女久久精品 | 最新av中文字幕 | 中文字幕网址在线 | 中文字字幕一区二区三区四区五区 | 黑人黄色一级片 | 理论片琪琪午夜电影 | 青娱乐极品视频在线 | 日韩日韩| 中文字幕av播放 | 97一区二区三区 | jzz国产| 开心激情久久 | 国产又爽又黄无码无遮挡在线观看 | 精品无码三级在线观看视频 | 欧美日韩综合 | 九九热精品在线观看 | 亚洲综合视频在线 | 中文在线√天堂 | aa黄色片| 97视频一区二区 | 看片日韩 | 中国黄色1级片 | www国产成人 | 日本不卡一区二区三区 | 国产精品一区二区三区在线 | 日韩夜夜| 91丨九色 | 免费日韩一区二区 | 成人国产精品免费观看视频 | 亚洲二区在线播放视频 |