2011-06-20 28 views
5

私はlua 5.1を使用していますが、C++から呼び出せる関数をロードするためにluaを使用しています。lua_pcallで呼び出されたlua関数のエラーメッセージが失われました

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:うち

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

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

ルア試験1

- Test.lua:1:エラーテスト成功

Luaのテスト2 :

アウト

- すごみが私の現在の理論は、エラーが発生した後にエラーメッセージがスタックの一番上に配置され、スタックは、その後1

に減少していることである

が起こっています

誰でもエラーメッセージの消失を防ぐ方法を知っていますか?

+1

「AlwaysErrorsOut」のコードを表示できますか? –

+0

int AlwaysErrorsOut(lua_State * LuaState) { \t return luaL_error(LuaState、 "エラーテストに成功"); } – khm

答えて

1

問題はそれで私が作成した別のLuaStackBalancerオブジェクトを持っていたし、エラーは、エラー・メッセージの喪失スローされたときにそのデストラクタが呼ばれていた、私は完全に見落としていた私のコードのいくつかのビットとありました。 ^^ u

私の愚かさを許してください、ありがとうございます。

+0

ではありません。私は答えとしてこれを設定する前に、10時間待たなければなりません。> – khm

0

完全にLuaに変換されたときにうまく動作するように見えます(下記参照)。lua_pcallには戻り値が設定されていない可能性があります。 Runへの呼び出しで0の代わりにLUA_MULTRETを使用してみてください。

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

'0'の代わりに' LUA_MULTRET'を使用していますか? – gwell

+0

いいえ、残念ながらそれは – khm

関連する問題