2011-08-02 9 views
0

私はluabindを使ってLuaにバインドしたC++プログラムを持っています。私は現在、luaとluabindが提供するエラー処理方法をテストしており、luaスクリプトのデバッグに役立ちます。目的は、構文エラーやプログラミングミスが発生したときにluabindやluaで例外をスローしてデバッグや修正ができるようにすることです。C++はlua例外をキャッチしません

現在のところ、以下のスクリプトはエラーメッセージや例外がスローされずに実行を停止するため、大きなプログラムではどこに問題があるのか​​わかりません。最初の場所。

のLua::(start.lua)

--complete file shown, this is meant to test the error handling of the C++ program 
print("This is valid") 
print(1234) 
bad_function() 
a = "meow" 
b = 7 
c = a + b 

C++:実行したときにここで

Engine *callbackEngine; 
int theCallback(lua_State *L) //This is so I can use my own function as an 
           //exception handler, pcall_log() 
{ 
    return callbackEngine->pcall_log(L); 
} 

void Engine::Run() 
{ 
    luabind::set_pcall_callback(&theCallback); //my own callback function, 
               //redirects to 
               //pcall_log() below 
try { 
    luaL_dofile(L, "scripts/start.lua"); 
} 
catch(luabind::error &sError) { //This never gets executed, noted by breakpoints 
    theCallback(L); 
} 
//etc...code not shown 

int Engine::pcall_log(lua_State *L) 
{ 
    lua_Debug d; 
    lua_getstack(L,1,&d); 
    lua_getinfo(L, "Sln", &d); 
    lua_pop(L, 1); 
    stringstream ss; 
    ss.clear(); 
    ss.str(""); 
    ss << d.short_src; 
    ss << ": "; 
    ss << d.currentline; 
    ss << ": "; 
    if (d.name != 0) 
    { 
     ss << d.namewhat; 
     ss << " "; 
     ss << d.name; 
     ss << ") "; 
    } 
    ss << lua_tostring(L, -1); 
    logger->log(ss.str().c_str(),ELL_ERROR); 
    return 1; 
} 

が出力されます:

This is valid 
1234 
ここ

は、関連するスニペットです

代わりにスクリプトの実行が停止する私が予期していたような例外を投げること。 luaが例外を投げるときやエラーを処理する別の方法を制御する方法はありますか?私はデバッグ情報を生成するためのロギング機能のセットアップを持っていますが、ブレークポイントは上記のcatchステートメントが実行されていないことを示しています。

ありがとうございました!

答えて

2

それをするために。 Luabindの機能を使用する必要があります。これは次のようになります。

namespace lb = luabind; 
int luaError = luaL_loadfile(pLuaState, "scripts/start.lua"); 
//Check for errors 

lb::object compiledScript(lb::from_stack(pLuaState, -1)); 
lb::call_function<void>(compiledScript); //Call the script. 

lua_pop(pLuaState, 1); //Remove the script from the stack. It's stored in our luabind::object 
+0

チャンクを 'lua_pcall'することはできますが、C++例外は期待できません。 Luabind 'ランタイム'は 'what()'例外メッセージを単にLuaスタックに置き、 'lua_error'を呼び出しますか?これは私がドキュメントから期待したものであり、簡単なテストで何が起きるかと思われます。 ( 'luabind :: call_function'を使用すると例外が発生します。) –

+0

@Brian:LuabindはLua APIを完全に無効にするわけではありません。それは単にその一部を包みます。ただし、文字列Luabindスタイルを取得する必要がある場合は、 'luabind :: from_stack'を使用してスタックエントリを' luabind :: object'に変換することができます。 –

+0

ありがとう、これは動作します!スクリプトでエラーが発生すると、必要に応じてコールバック関数にルーティングされます。エラーの後、ホストプログラムもクラッシュします。それでも探しています... – Brian

2

luaL_dofile()はLuabindの一部ではないので、Luabindの例外はありません。あなたが設定したハンドラは、Luabind自身がLuaから何かを呼び出すときに使用/渡されます(pcall()を使用)。 luaL_dofile()は基本的なLuaコード(Lサフィックスは呼び出しを単純化するライブラリラッパーとしてマークする)とプレーンCの一部ですので、独自のエラー処理(Lua/Luabindの例外を正当に使用することはありません)を行う必要があります。コール。

テストされていないが、次のコードでは、あなたのコードが何を期待何をすべき:あなたはLuabind経由のLuaスクリプトをロードする場合は、あなたがluaL_dofileまたは他の通常のLuaの関数を使用することはできません

if(!luaL_doFile(L, "scripts/start.lua")) 
    theCallback(L); 
関連する問題