c語言沒有try catch的替代方案
setjmp與longjmp
后綴jmp指的就是jump,關(guān)看名字就能猜到這哥倆是干啥的了。使用他們倆就可以讓程序控制流轉(zhuǎn)移,進而實現(xiàn)對異常的處理。
異常處理的結(jié)構(gòu)可以劃分為以下三個階段:
- 準備階段:在內(nèi)核棧保存通用寄存器內(nèi)容
- 處理階段:保存硬件出錯碼和異常類型號,然后向當前進程發(fā)送信號
- 恢復階段:恢復保存在內(nèi)核棧中的各個寄存器內(nèi)容,返回當前進程的斷電處繼續(xù)執(zhí)行
過程有點類似遞歸,只有文字你可能看的有點云里霧里,我們結(jié)合一個小例子來看看
#include <stdio.h> #include <setjmp.h> static jmp_buf buf; void second(void) { printf("second\n"); // 跳回setjmp的調(diào)用處 - 使得setjmp返回值為1 longjmp(buf, 1); } void first(void) { second(); //這行到不了,因為second里面longjmp已經(jīng)跳轉(zhuǎn)回去了 printf("first\n"); } int main() { int rc; rc = setjmp(buf); if (rc==0) { // 進入此行前,setjmp返回0 first(); } // longjmp跳轉(zhuǎn)回,setjmp返回1,因此進入此行 else if(rc==1){ printf("main\n"); } return 0; } /* the ressult as: second main */
現(xiàn)在我們再來看看兩個函數(shù)的聲明:
- setjmp(env) :將程序上下文存儲在env中
- longjmp(env,status):env指代setjmp中所保存的函數(shù)執(zhí)行狀態(tài)變量,status則是作為setjmp的返回值
當然你也可以用switch
代替上面的if else
,其實try catch就相當于上面的那個函數(shù)你可以參考這個實現(xiàn)try catch。
signal信號處理
個人覺得這個在linux下更好用,并且也提供了更多的信號量宏。
下面給出的是signal頭文件中的定義
#define SIGINT 2 // interrupt #define SIGILL 4 // illegal instruction - invalid function image #define SIGFPE 8 // floating point exception #define SIGSEGV 11 // segment violation #define SIGTERM 15 // Software termination signal from kill #define SIGBREAK 21 // Ctrl-Break sequence #define SIGABRT 22 // abnormal termination triggered by abort call
這里僅給出維基上的例子
#include <signal.h> #include <stdio.h> #include <stdlib.h> static void catch_function(int signal) { puts("Interactive attention signal caught."); } int main(void) { if (signal(SIGINT, catch_function) == SIG_ERR) { fputs("An error occurred while setting a signal handler.\n", stderr); return EXIT_FAILURE; } puts("Raising the interactive attention signal."); if (raise(SIGINT) != 0) { fputs("Error raising the signal.\n", stderr); return EXIT_FAILURE; } puts("Exiting."); return 0; }
總結(jié)
到此這篇關(guān)于c語言沒有try catch的替代方案的文章就介紹到這了,更多相關(guān)c語言try catch內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++學習貝葉斯分類器實現(xiàn)手寫數(shù)字識別示例解析
這篇文章主要介紹了在C++學習中如何采用貝葉斯分類器來實現(xiàn)手寫數(shù)字識別的示例及解析有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-10-10C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法示例
這篇文章主要介紹了C++基于蔡基姆拉爾森計算公式實現(xiàn)由年月日確定周幾的方法,涉及C++針對日期時間的數(shù)值運算相關(guān)操作技巧,需要的朋友可以參考下2017-07-07