C語言沒有像Java那樣的try catch處理異常錯誤的能力,不過可以用setjmp和longjmp兩個函數實現錯誤處理的基本邏輯。
setjmp(BUFFER)會將程序當前的寄存器狀態保存到BUFFER數組裏,這個數組用jmp_buf定義:
#include <setjmp.h>
jmp_buf BUFFER;
longjmp(BUFFER, n)將程序流跳到setjmp的位置,同時恢復BUFFER中保存的狀態。第二個參數n爲一個整數,當通過longjmp(BUFFER, n)跳轉到setjmp位置時,setjmp函數的返回值爲n;否則,如果是直接執行setjmp,則返回爲零。根據這個特性,可以將整數n視爲錯誤代碼,這樣在執行 setjmp(BUFFER) 會就可以知道是哪一種錯誤被觸發了。
一個小例子如下:
#include <stdio.h>
#include <setjmp.h>
jmp_buf BUFFER;
void handle_error()
{
int err_code = setjmp(BUFFER);
if(err_code != 0)
{
printf("Error code: %d\n", err_code);
}
}
void trigger_error(int err_code)
{
longjmp(BUFFER, err_code);
}
int main()
{
handle_error();
trigger_error(1);
trigger_error(2);
return 0;
}
在上面的代碼中,trigger_error觸發了兩個錯誤,都被handle_error捕獲到了,這是個簡單完整的錯誤處理的例子。由於保存運行狀態的BUFFER數組要在不同的函數中使用,因此BUFFER要聲明爲全局變量,這是一個不太優雅的地方。
轉自:http://programmingnote.com/blog/?p=179