私は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ステートメントが実行されていないことを示しています。
ありがとうございました!
チャンクを 'lua_pcall'することはできますが、C++例外は期待できません。 Luabind 'ランタイム'は 'what()'例外メッセージを単にLuaスタックに置き、 'lua_error'を呼び出しますか?これは私がドキュメントから期待したものであり、簡単なテストで何が起きるかと思われます。 ( 'luabind :: call_function'を使用すると例外が発生します。) –
@Brian:LuabindはLua APIを完全に無効にするわけではありません。それは単にその一部を包みます。ただし、文字列Luabindスタイルを取得する必要がある場合は、 'luabind :: from_stack'を使用してスタックエントリを' luabind :: object'に変換することができます。 –
ありがとう、これは動作します!スクリプトでエラーが発生すると、必要に応じてコールバック関数にルーティングされます。エラーの後、ホストプログラムもクラッシュします。それでも探しています... – Brian