知識分享:C語言如何對異常進(jìn)行捕獲?
C++中可以使用try...catch對異常進(jìn)行捕獲,C語言呢?可能很多人都不知道,C語言中也有類似的接口,可以保存程序運(yùn)行的位置然后在特定的位置進(jìn)行恢復(fù)使得程序能夠回到先前保存的地方。而這整個(gè)功能的主要依靠setjmp和longjmp來實(shí)現(xiàn)。

1 int setjmp(jmp_buf env)
setjmp需要被先調(diào)用,調(diào)用之后,setjmp就保存了一份程序的計(jì)數(shù)器和當(dāng)前棧頂指針,當(dāng)然,根據(jù)需要也可以保存一些變量的初始化信息。返回返回值為0。?使用方法如下面代碼所示:

2 void longjmp(jmp_buf?env,int val)
在調(diào)用了setjmp后調(diào)用longjmp可以恢復(fù)保存的值并有效的將setjmp保存的計(jì)數(shù)器和棧信息恢復(fù)到之前的狀態(tài),這個(gè)過程也是堆棧展開的過程。因?yàn)閘ongjmp是回到原來保存程序狀態(tài)的位置,因此也可以稱之為從哪里來到哪里去。在上面的代碼中使用longjmp后,程序執(zhí)行效果如下所示:

如上,在調(diào)用TestSuit后,函數(shù)里面因?yàn)檎{(diào)用了longjmp因此程序狀態(tài)恢復(fù)到setjmp的位置,又因?yàn)樵趌ongjmp的第二個(gè)參數(shù)設(shè)置了setjmp的返回值,因此TestSuit函數(shù)中l(wèi)ongjmp后的代碼將不被執(zhí)行。程序返回到main函數(shù),執(zhí)行if條件值為真后的語句。上面代碼的運(yùn)行結(jié)果為:

- EOF -
寫在最后:對于準(zhǔn)備學(xué)習(xí)C/C++編程的小伙伴,如果你想更好的提升你的編程核心能力(內(nèi)功)不妨從現(xiàn)在開始!
微信公眾號:C語言編程學(xué)習(xí)基地
整理分享(多年學(xué)習(xí)的源碼、項(xiàng)目實(shí)戰(zhàn)視頻、項(xiàng)目筆記,基礎(chǔ)入門教程)
歡迎轉(zhuǎn)行和學(xué)習(xí)編程的伙伴,利用更多的資料學(xué)習(xí)成長比自己琢磨更快哦!
編程學(xué)習(xí)書籍分享:
