プログラム (C++、D3D9) と Lua に取り組んでいます。私はすでに LUA API を実装しており、エラー処理以外はすべて正常に動作しています。私はたくさんグーグルで検索し、ほとんどのエラーを処理するソリューションを見つけました。他のエラーのためにこれを書きます。
関連するコードを写真で紹介します。



最も重要な関数: PerformCall() と LuaErrorReport()

ただし、前に述べたように、いくつかのエラーが処理されています。しかし、これはそうではありません。
プログラム (C++、D3D9) と Lua に取り組んでいます。私はすでに LUA API を実装しており、エラー処理以外はすべて正常に動作しています。私はたくさんグーグルで検索し、ほとんどのエラーを処理するソリューションを見つけました。他のエラーのためにこれを書きます。
関連するコードを写真で紹介します。



最も重要な関数: PerformCall() と LuaErrorReport()

ただし、前に述べたように、いくつかのエラーが処理されています。しかし、これはそうではありません。
何が間違っている可能性があるかについてのいくつかの考え。代わりにwhile getsを渡していますL 。彼らは、コルーチンのコンテキストのように発生する可能性のあるさまざまな作業を行っている可能性があります。これが意図的なものである場合は、少なくとも、これが行われている理由をどこかに示してください。lua_pcallLuaErrorReportState()lua_State
lua_pushvalue中身LuaErrorReportも怪しい。スタックの一番下の値が、報告しているメッセージを保持していることをどのように確認できますか? この関数は、スタック上により多くの値を蓄積した可能性のある他の関数から呼び出されます。私はそれを次のように変更します
lua_pushvalue(L, -3);
また
lua_pushstring(L, msg);
最後に、より意味のあるスタック トレース エラー メッセージを取得するためにdebug.traceback、エラー関数としてを渡すことも検討する必要があります。lua_pcall何かのようなもの:
void LUA::PerformCall(int return_amount)
{
lua_getglobal(L, "debug");
lua_getfield(L, -1, "traceback");
lua_remove(L, -2);
int errindex = -p_iArgCount - 2;
lua_insert(L, errindex);
int error = lua_pcall(L, p_iArgCount, return_amount, errindex);
// ...
debug.traceで呼び出しを取り除きLuaErrorReportます。