C語言錯誤處理——setjmp & longjmp


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
發佈了52 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章