您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如果c語言沒有try catch怎么辦?,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
setjmp與longjmp
后綴jmp指的就是jump,關看名字就能猜到這哥倆是干啥的了。使用他們倆就可以讓程序控制流轉移,進而實現對異常的處理。
異常處理的結構可以劃分為以下三個階段:
過程有點類似遞歸,只有文字你可能看的有點云里霧里,我們結合一個小例子來看看
#include <stdio.h> #include <setjmp.h> static jmp_buf buf; void second(void) { printf("second\n"); // 跳回setjmp的調用處 - 使得setjmp返回值為1 longjmp(buf, 1); } void first(void) { second(); //這行到不了,因為second里面longjmp已經跳轉回去了 printf("first\n"); } int main() { int rc; rc = setjmp(buf); if (rc==0) { // 進入此行前,setjmp返回0 first(); } // longjmp跳轉回,setjmp返回1,因此進入此行 else if(rc==1){ printf("main\n"); } return 0; } /* the ressult as: second main */
現在我們再來看看兩個函數的聲明:
當然你也可以用switch
代替上面的if else
,其實try catch就相當于上面的那個函數你可以參考這個實現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; }
關于如果c語言沒有try catch怎么辦?就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。