2010-02-16 114 views
3

我在當前項目中嵌入了一個Lua解釋器(編寫於C),我在尋找一個如何處理錯誤的例子。這是我迄今爲止...在Lua中使用longjmp處理錯誤

if(0 != setjmp(jmpbuffer)) /* Where does this buffer come from ? */ 
{ 
    printf("Aargh an error!\n"); 
    return; 
} 
lua_getfield(L, LUA_GLOBALSINDEX, "myfunction"); 
lua_call(L, 0, 0); 
printf("Lua code ran OK.\n"); 

手冊只是說,錯誤使用的longjmp函數拋出,但longjmp的需要一個緩衝。我需要提供嗎?還是Lua分配緩衝區?這本手冊有點含糊。

回答

8

經過一番研究和一些RTFS,我已經解決了這個問題。我一直在吠叫完全錯誤的樹。

儘管Lua API參考指出longjmp用於錯誤處理,但longjmp緩衝區根本不通過API公開。

要在Lua函數中捕獲錯誤,您需要使用lua_pcall()。我的代碼的例子可以寫成這樣,它的工作原理:

lua_getfield(L, LUA_GLOBALSINDEX, "myfunction"); 

if(0 != lua_pcall(L, 0, 0, 0)) 
    printf("Lua error: %s\n", lua_tostring(L, -1)); 
else 
    printf("Lua code ran OK.\n"); 
-1

跳轉緩衝區鏈是由errorJmp字段指向的struct lua_longjmp字段中的一部分,該字段位於每個線程狀態struct lua_State。這是在Lua核心標題lstate.h中定義的。 Here是相同的交叉參考Doxygen。

我想(我不是一個Lua專家)你應該使用LUAI_TRY宏。

希望這會有所幫助。

+1

嗯,我可能會找錯了樹本,做一些RTFS後,我覺得整個的setjmp/longjmp的事情可能在Lua是內部的。也許錯誤以我尚未解決的其他方式處理。我仍在調查。 – 2010-02-16 05:14:07

+0

好的,我解決了。如果我想捕捉錯誤,我需要使用lua_pcall函數。 – 2010-02-16 07:12:30