繁体   English   中英

Lua捕捉例外

[英]Lua Catching Exceptions

我正在用Lua(和C ++)编码。 我想捕获异常并将其打印到控制台中。 lua_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值)

有任何想法吗?

这个可以看出lua_atpanic将永远退出应用程序,除非你从恐慌函数中做了跳远。

而从这个可以看到,调用lua_pcall(L, 0, LUA_MULTRET, 0)将推动一个错误信息到堆栈,当你不给它一个堆栈单元(errfunc为0)。

由于Lua是C库,因此它不使用异常(即C ++异常),因此您永远不会从Lua代码中catch这种野兽。 但是,您的代码可能会引发异常。 为此,您必须将Lua库编译为C ++。

进一步阅读:

从Lua调用函数时如何处理C ++异常?

将Lua编译为C ++除了避免'extern C'并获得'C ++ exception'之外还有什么好处?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM