2011-06-20 32 views
5

我使用的是lua 5.1,我使用lua加載了可以從C++調用的函數。lua函數調用lua_pcall geting失敗的錯誤消息

int Error = luaL_loadfile(LuaState, "Test.lua"); 
if(!Error) 
{ 
    Error = lua_pcall(LuaState, 0, LUA_MULTRET, 0); 
} 
if(Error) 
{ 
    std::cerr << "-- " << lua_tostring(LuaState, -1) << std::endl; 
    lua_pop(LuaState, 1); 
} 
else 
{ 
    LuaStackBalancer LSB(LuaState); //Puts the Lua Stack back to the way it was found 
    lua_pushstring(LuaState, "Run"); 
    lua_gettable(LuaState, LUA_GLOBALSINDEX); 
    if(lua_isfunction(LuaState, -1)) 
    { 
     if(lua_pcall(LuaState, 0, 0, 0)) 
     { 
      std::cerr << "-- " << lua_tostring(LuaState, -1) << std::endl; 
     } 
    } 
} 

的問題是,如果我從C++調用LUA函數調用另一個函數的錯誤了,那麼返回的是功能,而不是錯誤消息的第一個參數。

AlwaysErrorsOut定義爲:

int AlwaysErrorsOut(lua_State *LuaState) 
{ 
    return luaL_error(LuaState, "Error Test Successful"); 
} 

的Lua測試1:

--Test.lua 
AlwaysErrorsOut("Weirdness is happening") 

輸出:

- Test.lua:1:錯誤測試成功

的Lua試驗2 :

--Test.lua 
function Run() 
    AlwaysErrorsOut("Weirdness is happening") 
end 

輸出:

- 怪誕正在發生

我當前的理論是,後錯誤發生錯誤信息被放置在堆棧的頂部,然後將堆疊被減少到1。

任何人都知道如何防止錯誤信息的丟失?

+1

你能展示'AlwaysErrorsOut'的代碼嗎? –

+0

int AlwaysErrorsOut(lua_State * LuaState) { \t return luaL_error(LuaState,「Error Test Successful」); } – khm

回答

1

的問題是與我的一些代碼位我已經完全被忽視,在這我有創建另一個LuaStackBalancer對象,並拋出的錯誤時產生的錯誤信息的丟失它的析構函數被調用。 ^^ü

謝謝大家的幫助,請原諒我的愚蠢

+0

,顯然我必須等上10個小時才能將其設置爲答案>。> – khm

0

似乎在完全轉換爲Lua時可以正常工作(請參見下文)。問題可能是lua_pcall被設置爲無返回值。撥打Run,嘗試使用LUA_MULTRET而不是0

local x=loadstring[[ 
function AlwaysErrorsOut(s) 
    error("Test Successfull") 
end 

function Run() 
    AlwaysErrorsOut("Weirdness is happening") 
end 
]] 

local a,b = pcall(x) 

print(a) --> true 
print(b) --> nil 

local a,b = pcall(_G["Run"]) 

print(a) --> false 
print(b) --> [string "function AlwaysErrorsOut(s)..."]:2: Test Successfull 
+0

是的,它的劑量,但我希望能夠從C++調用Lua函數並獲取錯誤消息 – khm

+0

使用'LUA_MULTRET'而不是'0'工作嗎? – gwell

+0

不,不幸的是,它不是 – khm

相關問題