C語言setjmp()和longjmp()實現異常處理機制。
setjmp() 用于保存當前的程序執行狀態。
longjmp() 用于在后面的某個時刻返回到setjmp()點的狀態。
類似goto。但goto是本地的,只能在函數內部跳轉。
setjmp()和longjmp()是非局部跳轉語句,可在調用棧上,返回到調用路徑上的某一個函數中。
頭文件<setjmp.h>
#include <stdio.h>
#include <setjmp.h>static jmp_buf buf;void otherfunction(void) {printf("some error\n"); longjmp(buf,1); // 跳回setjmp的調用處 - 使得setjmp返回值為1
}void deal(void) {otherfunction();printf("deal done\n");
}int main() { if ( ! setjmp(buf) ) { // 設置成功,第一次返回0,longjmp后返回1deal(); } else { printf(”catch error\n"); }return 0;
}
輸出
some error
catch error
在C++中,setjmp 和 longjmp 通常不被推薦使用。
因為C++提供了更強大和類型安全的異常處理機制,即 try, catch, 和 throw 關鍵字。這些關鍵字允許你在代碼中定義異常處理塊,并在需要時拋出異常,由相應的 catch 塊捕獲并處理。