日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

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

 quasiceo 2014-01-03

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


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

#include <setjmp.h>
jmp_buf BUFFER;

longjmp(BUFFER, n)將程序流跳到setjmp的位置,同時恢復(fù)BUFFER中保存的狀態(tài)。第二個參數(shù)n為一個整數(shù),當通過longjmp(BUFFER, n)跳轉(zhuǎn)到setjmp位置時,setjmp函數(shù)的返回值為n;否則,如果是直接執(zhí)行setjmp,則返回為零。根據(jù)這個特性,可以將整數(shù)n視為錯誤代碼,這樣在執(zhí)行 setjmp(BUFFER) 會就可以知道是哪一種錯誤被觸發(fā)了。
一個小例子如下:
#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觸發(fā)了兩個錯誤,都被handle_error捕獲到了,這是個簡單完整的錯誤處理的例子。由于保存運行狀態(tài)的BUFFER數(shù)組要在不同的函數(shù)中使用,因此BUFFER要聲明為全局變量,這是一個不太優(yōu)雅的地方。


轉(zhuǎn)自:http:///blog/?p=179
------------------------------------------------------------
本文由WindTaiL在cnblogs中發(fā)布,轉(zhuǎn)載請注明出處

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多