2

lua コードで例外が発生すると、luabind はスタックにエラー メッセージを残して、私が収集できるようにします。例外を処理した後、lua スタックが適切な状態になることを保証する方法を考えています。

  1. 私が見つけた例では、 を使用するように指示されていますluabind::from_stack(e.state(), -1)。これにより、エラー メッセージがスタックに残りませんか? 私はそれをポップすべきではありませんか?

  2. スタックからエラー メッセージをポップするだけで十分ですか? エラーにより、他のガベージがスタックに残されますか?

エラーが発生した後、lua の状態が良好であることを確認するにはどうすればよいですか?

これは私が持っているものです:

try  {
    // Do lua-stuff here that causes an exception from lua
}
catch (const luabind::error& e) {
    luabind::object error_msg(luabind::from_stack(e.state(), -1));

    std::stringstream ss;
    ss << error_msg;

    throw my_own_exception_class(ss.str());
}
4

2 に答える 2

1
  1. スタックにエラーメッセージが残ります。ポップする必要があるかどうかは、次にスタックで何をするかに完全に依存します。メッセージがもう必要ない場合 (別の場所に保存したため)、ポップします。キャッチチェーンのさらに下で使用する場合は、そのままにしておきます。要点は、Lua スタックを使用して Lua API と通信することです。スタック上にあるものは、API に何を伝えたいかによって完全に異なります。

  2. ここで「ガベージ」を解釈するには、次の 2 つの方法があります。

    • 「Luaスタックの内部構造が侵害されており、lua_XXX関数への呼び出しはSEGFAULT/crash/etc」のように。どのような C++ 例外をスローしても、これは決して起こらないはずです。これを防ぐのは Luabind の責任です。Lua 自体は C で記述されており、Lua の世界には例外などがないため、C++ の例外はすべて Luabind によってスローされ、処理されます。

    • 「スタックにもう必要のない値がいくつかあります」のように。スタックにガベージが残ってはいけません。偏執的であると感じた場合はlua_settop(0)、Lua API 呼び出しのチェーンの前にスタックをクリアしてください。

于 2011-05-17T17:50:53.233 に答える
0

最も簡単な方法はおそらくこれです

 int luaErr = luaL_dofile(luaState, "main.lua"); // or other lua stuff
 if (luaErr != 0)
      std::cout << "Lua error: " << lua_tostring(luaState, -1) << std::end
于 2012-08-04T15:32:31.607 に答える