0

Lua (および C++) でコーディングしています。例外をキャッチしてコンソールに出力したい。Afterlua_atpanicが正しく動作しませんでした (プログラムはとにかく終了しました)。例外を使用することを考えました。

これが私の編集された部分ですluaconf.h

/* C++ exceptions */
#define LUAI_THROW(L,c) throw(c)
#define LUAI_TRY(L,c,a) try { a } catch(...) \
{ if ((c)->status == 0) (c)->status = -1; }
#define luai_jmpbuf int  /* dummy variable */

init.luaロードされたものは次のとおりです。

int init = luaL_loadfile(L, "lua/init.lua");
if(init == 0)
{
    printf("[LUA] Included lua/init.lua\n");
    init = lua_pcall(L, 0, LUA_MULTRET, 0);
}

C++ の例外を使用する場合は、そのコードを次のように編集します。

try {
    int init = luaL_loadfile(L, "lua/init.lua");

    if(init == 0)
    {
        printf("[LUA] Included lua/init.lua\n");
        init = lua_pcall(L, 0, LUA_MULTRET, 0);
    }

    // Error Reporting
    if(init != 0) {
        printf("[LUA] Exception:\n");
        printf(lua_tostring(L, -1));
        printf("\n\n");
        lua_pop(L, 1);
    } else {
        lua_getglobal(L, "Init");
        lua_call(L, 0, 0);
    }
} catch(...)
{
    MessageBox(NULL, "Hi", "Hio", NULL);
}

何かが起こるかどうかを確認するだけです。しかし、何も起こりません。(Lua エラーは値を呼び出していnilます)

何か案は?

4

1 に答える 1

4

このことからlua_atpanic、パニック関数内から長いジャンプを行わない限り、常にアプリケーションを終了することがわかります。

このことからlua_pcall(L, 0, LUA_MULTRET, 0)、スタックの場所を指定しない場合 (errfunc が 0)、呼び出すとエラー メッセージがスタックにプッシュされることがわかります。

Lua は C ライブラリであるため、例外 (C++ 例外) を使用しないためcatch、Lua コードからそのような野獣になることはありません。ただし、コードは例外をスローする可能性があります。これを行うには、Lua ライブラリを C++ としてコンパイルする必要があります。

参考文献:

Lua から関数を呼び出すときに C++ 例外を処理する方法は?

「extern C」を回避して「C++例外」を取得する以外に、LuaをC++としてコンパイルする利点は何ですか?

于 2012-11-26T13:20:08.220 に答える