C語言異常處理——setjmp & longjmp



C語言沒有像Java那樣的try catch處理異常錯誤的能力,不過可以用setjmp和longjmp兩個函數實現錯誤處理的基本邏輯。
setjmp(BUFFER)會將程序當前的寄存器狀態保存到BUFFER數組裏,這個數組用jmp_buf定義:

  1. #include <setjmp.h>  
  2. jmp_buf BUFFER;  
#include <setjmp.h>
jmp_buf BUFFER;

longjmp(BUFFER, n)將程序流跳到setjmp的位置,同時恢復BUFFER中保存的狀態。第二個參數n爲一個整數,當通過longjmp(BUFFER, n)跳轉到setjmp位置時,setjmp函數的返回值爲n;否則,如果是直接執行setjmp,則返回爲零。根據這個特性,可以將整數n視爲錯誤代碼,這樣在執行 setjmp(BUFFER) 會就可以知道是哪一種錯誤被觸發了。
一個小例子如下:

  1. #include <stdio.h>  
  2. #include <setjmp.h>  
  3. jmp_buf BUFFER;  
  4.    
  5. void handle_error()  
  6. {  
  7.     int err_code = setjmp(BUFFER);  
  8.     if(err_code != 0)  
  9.     {  
  10.         printf("Error code: %d\n", err_code);  
  11.     }  
  12. }  
  13.    
  14. void trigger_error(int err_code)  
  15. {  
  16.     longjmp(BUFFER, err_code);  
  17. }  
  18.    
  19. int main()  
  20. {  
  21.     handle_error();  
  22.     trigger_error(1);  
  23.     trigger_error(2);  
  24.    
  25.     return 0;  
  26. }  
#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要聲明爲全局變量,這是一個不太優雅的地方

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章