以防弹方式处理Lu中的Lua调用和错误

时间:2015-02-19 13:39:50

标签: c design-patterns error-handling lua lua-api

我在Lua电子设备模拟插件上工作 我想在设计和可用性方面做得很好,因为很多用户可能远非IT和调试 用户在Lua中描述设备,插件通过Lua C API进行翻译 用户可能拼错函数名称,变量类型和参数顺序 良好的手动帮助,但应用程序不应崩溃或提供错误的描述错误。我没有找到任何“最佳实践”,并且想要体验用户,因为我对Lua很新。

参数的顺序和类型

目前,Lua函数声明如下:

typedef struct lua_bind_func
{
    int32_t ( *lua_c_api ) ( lua_State* );
    const char* lua_func_name;
} lua_bind_func;

然后

{.lua_func_name="state_to_string", .lua_c_api=&lua_state_to_string},

为了检查参数顺序和类型是否正确传递:

创建宏:

#define STRING (&lua_isstring)
#define INT (&lua_isinteger)
#define USER (&lua_islightuserdata)

将数组添加到列表中:

int ( *args[16] ) ( lua_State*, int index );

更改功能列表:

{.lua_func_name="set_callback", .lua_c_api=&lua_set_callback, .args={INT, INT}}

参数列表检查器:

static void
SAFE_EXECUTE ( lua_State* L, void* curfunc )
{
    int argnum = lua_gettop ( L );
    for ( int i=0; lua_c_api_list[i].lua_func_name; i++ )
    {
        if ( curfunc == lua_c_api_list[i].lua_c_api )
        {
            for ( int argcount=0; lua_c_api_list[i].args[argcount]; argcount++ )
            {
                if ( argnum < argcount+1 )
                {
                    IDSIMMODEL* model = ( IDSIMMODEL* ) lua_get_model_obj ( L );
                    print_error ( model, "Too few arguments passed to the function \"%s\"", lua_c_api_list[i].lua_func_name );
                }
                else if ( !lua_c_api_list[i].args[argcount] ( L, argcount+1 ) )
                {
                    IDSIMMODEL* model = ( IDSIMMODEL* ) lua_get_model_obj ( L );
                    print_error ( model, "Argument %d is of wrong type", argcount+1 );
                }
            }
        }
    }
}

然后我可以查看参数顺序,它们的类型,并可以使用迷你帮助创建相应的错误消息:

SAFE_EXECUTE ( L, &lua_set_callback );

代码不处理额外的参数,但很容易添加。
问题:是否可以使用或者可能有更好的情况?

拼写错误的函数名称

例如,我有以下代码:

set_callback(time + 100 * MSEC, PC_EVENT)   
set_calback(time + 200 * MSEC, PC_EVENT)
set_callback(time + 333 * MSEC, PC_EVENT)   

第二个拼写错误,在此部分之后没有执行任何代码 我无法理解如何在C中捕获对未定义函数的调用以引起足够的错误。

其他陷阱

也许还有更多我不知道的陷阱?

1 个答案:

答案 0 :(得分:1)

使用Lua运行调用C函数的脚本:

  • 使用Lua协议编写要导出到Lua的每个C函数以获取参数并返回值。
  • 将这些C函数导出为Lua作为全局变量或表中的字段。
  • 运行用户脚本捕获语法错误和执行错误, 使用受保护的电话。
  • (可选)为用户脚本提供解析全局变量的环境。

C API提供的功能可以在不需要太多工作的情况下完成所有这些工作。

请参阅Lua源代码中包含的标准C库。从最简单的开始,例如mathos

另请阅读书籍Programming in Lua