我有一段像这样的代码
class Test
{
public:
Test() {printf(">>> Test()\n");}
~Test() {printf(">>> ~Test()\n");}
}
int myFunc(lua_State *L)
{
Test t;
luaL_error(L, "error");
return 0;
}
我知道当lua遵守c complier时,它使用longjmp来引发错误。因此,我编译它使用c ++编译器,以便它使用c ++异常来处理错误,即使抛出错误也应该调用析构函数。但我的问题是没有调用对象的析构函数。
但是,以下代码正在运行(调用析构函数)
int myFunc(lua_State *L)
{
Test t;
throw(1) // just for testing
return 0;
}
为什么会这样?我确定LUAI_THROW宏被解释为抛出关键字。
答案 0 :(得分:1)
函数luaL_error()将调用exit()来取消整个程序的执行!然后不调用析构函数,因为Test t所在的范围不会结束。您应该使用其他功能才能从错误中恢复。
如何从lua调用错误?我认为您需要使用lua_cpcall进行受保护的调用,以便在错误功能上绕过此出口!
答案 1 :(得分:1)
根本原因与visual c ++编译器中的异常处理模式有关。我使用lua函数(例如luaL_error)和extern" C"修饰符,以防止编译器进行名称修改。默认的异常处理模式是/ EHsc,它假定extern" C"功能不会抛出异常。因此,无法捕获异常。解决方案是将/ EHsc更改为/ EHs。
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/1deeycx5.aspx。