锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
#include <setjmp.h>
2
#include <stdio.h>
3
4
void
5
main()
6

{
7
jmp_buf env;
8
int jmpflag;
9
10
do
{
11
if ((jmpflag = setjmp(env)) == 0)
{ /**//* try */
12
printf("run normal block\n");
13
longjmp(env, 1); /**//* throw exception 1 */
14
}
15
else if (jmpflag == 1)
{ /**//* catch (exception 1) */
16
printf("catch exception 1\n");
17
}
18
else
{ /**//* catch (
), optional*/
19
printf("cathc all\n");
20
}
21
/**//* no catcher, use longjmp(prev_env, 1) to prev jmp point */
22
} while (0);
23
}
涓婇潰鐨勮繖孌典唬鐮佸甫鏉ュ涓嬮棶棰橈細
1. 涓轟綍瑕佷嬌鐢╠o...while (0)?
2. 浣跨敤寮傚父鐮佷唬琛ㄥ紓甯告槸鍚﹀悎閫?
3. 褰撳紓甯告湭琚崟鑾鋒椂錛屽浣曚涪緇欎笂涓灞?
1. 鏈剰鏄敤{}鏋勯犱竴涓唬鐮佸潡浠ュ鐞嗘湭鎹曡幏涔嬪紓甯革紝鑰岀敤do...while(0)鍙互鍒╀簬瀹忓寲銆?br>2. 涓嶅悎閫傦紝鍥犱負寮傚父鐮佺殑鎼哄甫淇℃伅閲忓お灝戯紝鍙﹀寮傚父鐮佷笉鑳戒負0銆備笅闈負浜嗙畝鍗曡鏄庯紝鎴戜滑榪樻槸鐢ㄥ紓甯哥爜浣滀負璁捐銆?br>3. 瀹為檯涓婂氨鏄浣曚繚瀛樹笂涓灞傜殑璺寵漿鐐圭殑闂錛岃繖涔熸槸寮傚父浣撶郴璁捐鐨勯噸鐐廣?br>
涓涓畝鍗曠殑鏂規(guī)鏄繚瀛樹竴涓紓甯告爤錛?br>* 姣忚繘鍏ヤ竴灞倀ry錛屾垜浠氨鍘嬪叆涓涓綋鍓嶅紓甯稿撫錛?br>* 姣忓綋涓涓寮傚父琚崟鑾鳳紝寮瑰嚭褰撳墠寮傚父甯с?br>* 姣忓綋鎶涘嚭鎴栭噸鏂版姏鍑轟竴涓紓甯告椂錛屼嬌鐢ㄦ爤欏剁殑寮傚父甯ц煩杞埌涓涓猚atch鍧椼?br>
涓轟簡鑳藉璺寵漿鍒頒竴涓猚atch鍧楋紝涓涓紓甯稿撫鑷沖皯鍖呮嫭淇℃伅錛?br>1. 璺寵漿鐐圭幆澧僯mp_buf錛涙敞鎰忎唬鐮?3琛岋紝榪欓噷鐪嬭搗鏉ongjmp(env, 1); 鐢變簬鎴戜滑闇瑕佽璁℃垚RAISE(1); 鎵浠nv涓嶅繀鎸囧畾;
閭d箞env鍙洿鎺ユ潵鑷眬閮ㄥ彉閲忥紝浣嗘槸鐢變簬longjmp涔熷彲鑳芥槸鍦ㄤ竴涓嚱鏁頒腑琚皟鐢紝榪欐椂env蹇呴』鍙互鍏ㄥ眬璁塊棶錛岃岀敤寮傚父鏍堜繚瀛樿繖涓俊鎭究鍙仛鍒般?br>2. 璺寵漿鐐圭殑寮傚父鐮侊紱灝界鎶涘嚭鍜屾崟鑾峰紓甯告椂閮介渶瑕佸埗瀹氬紓甯哥爜錛屼絾鏄浜庝竴涓湭鎹曡幏鐨勫紓甯革紝鎴戜滑浣跨敤RERAISE()鏄笉闇瑕佹寚瀹氬紓甯哥爜鐨勶紝鍥犳錛屽紓甯哥爜蹇呴』淇濆瓨浜庢煇澶勶紝寮傚父鏍堜究鏄釜濂藉湴鏂廣?br>3. 涓婁竴綰у紓甯稿撫鎸囬拡錛岃繖鏄敮鎸佹爤緇撴瀯蹇呴』鐨勩?br>

struct exceptframe
{
2
jmp_buf env;
3
int ecode;
4
exceptframe *prev;
5
};
瀵逛簬浠諱綍涓涓▼搴忥紝鍚屼竴鏃跺埢鍙湁涓涓紓甯歌繍琛岋紝鎹㈠彞璇濊錛屽綋涓涓紓甯稿皻鏈鐞嗗畬姣曪紝涓嶅簲璇ユ湁鍙︿竴涓紓甯告姏鍑恒傚熀浜庤繖涓師鍥狅紝涓涓▼搴忓彧闇瑕佷竴涓紓甯告爤鍗沖彲,涓嶅悓鏃跺埢錛岃寮傚父鏍堟湇鍔′簬涓嶅悓鐨勫紓甯搞傛垜浠敤涓涓叏灞鍙橀噺浠h〃寮傚父鏍?br>struct exceptframe *exceptstack;
]]>