2011-12-23 126 views
2

我想用LuaJava從Java調用一個簡單的Lua函數。 calc.lua:LuaJava錯誤處理中的錯誤

function foo(n) return n*2 end 

這就是所有存在calc.lua和命令行工作的後續調用。

這裏是一個總是具有調用錯誤:

L.getGlobal("foo");  
L.pushNumber(8.0); 
int retCode=L.pcall(1, 1,-2); // retCode value is always 5 pcall(numArgs,numRet,errHandler) 
String s = L.toString(-1);  // s= "Error in Error Handling Code" 

我也曾嘗試
L.remove(-2); (-2); L.insert(-2);

不知道爲什麼它給出任何錯誤或錯誤是什麼。也許我沒有正確設置錯誤處理程序?所以它不會打電話?加載後,我嘗試從控制檯,並可以運行打印(foo(5))如預期恢復10。

更新:它看起來像我需要在堆棧上提供一個錯誤處理程序。什麼是這樣的錯誤處理程序的簽名,以及如何將它放在堆棧上的一個點上。謝謝

回答

1

這是從Lua的參考手冊採取 - 下C API section它說,這大約PCALL:

當你調用與lua_call函數,調用函數中的任何錯誤向上傳播(使用的longjmp )。如果你需要處理錯誤,那麼你應該使用lua_pcall:

int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc); 

...

如果errfunc爲0,則返回的錯誤信息是完全 原始的錯誤消息。否則,errfunc爲 提供一個錯誤處理函數的堆棧索引。 (在當前的實施方式中,該索引 不能是僞索引。)在運行時錯誤的情況下,該函數 將與錯誤消息被稱爲和其返回值將是lua_pcall返回的 消息

因此,假設LuaJava的API只是反映了C API,那麼只需傳遞0即可表明沒有特殊的errfunc。像這樣的東西應該工作:

int retCode = L.pcall(1, 1, 0); 
String errstr = retCode ? L.toString(-1) : ""; 
+0

好的。我現在收到錯誤消息。 – Androider 2011-12-24 02:12:09

+0

這是另一個問題,但現在我得到的錯誤是試圖對局部變量n進行算術運算。 – Androider 2011-12-24 02:43:52

+0

這裏是關於產生的錯誤代碼的問題的鏈接http://stackoverflow.com/questions/8622409/lua-error-attempt-to-perform-arithmetic-on-local-variable – Androider 2011-12-24 03:06:04

0

你爲什麼提供-2?那不應該在那裏。你已經告訴Lua,在Lua棧中存在一個錯誤函數,它將處理索引-2處的錯誤,而你的代碼並不指明任何類型。在大多數情況下,pcall應該只有兩個參數。

+0

好的。我認爲這裏有一個問題。 LuaState.call(a,b)但是LuaCall.pcall(a,b,error_index)。那麼我應該把什麼放入error_index? – Androider 2011-12-23 23:29:45

+0

以及如何設置處理程序。我如何設置錯誤功能? – Androider 2011-12-23 23:30:51

+0

@Androider:默認的應該沒問題。你應該沒問題,只要'pcall(a,b);'。 – Puppy 2011-12-23 23:41:40