处理库代码中的错误
Lua 是一种安全的语言,这意味着不管用 Lua 写什么,也不管写出来的内容有多么不正确,Lua 自身所提供的机制总是能用来理解程序的行为。此外,程序中的错误(error) 也是通过 Lua 语言的机制来检测和解释的。与之相对的是,许多 C 语言代码中的错误只能从底层硬件的角度来解释(例如,把异常位置作为指令地址给出)。
一旦我们向 Lua 语言中加入新的 C 函数,这种安全性就可能被打破。例如,一个等价于 BASIC 命令 poke 的函数(该函数用于将任意的字节存储到任意的地址中)就可能导致各种各样的内存崩溃。因此,程序员的责任就是确保加入到 Lua 语言中的内容是安全的,并提供妥善的错误处理。
C 语言程序必须通过 lua_pcall 设置错误处理。不过,在为 Lua 编写库函数时,通常无须处理错误。库函数抛出的错误要么被 Lua 中的 pcall 捕获,要么被应用代码中的 lua_pcall 捕获。因此,当 C 语言库中的函数检测到错误时,只需简单地调用 lua_error 即可(或调用 luaL_error, 它会格式化错误信息,然后调用 lua_error)。函数 lua_error 会收拾 Lua 系统中的残局,然后跳转回保护模式调用处,并传递错误信息。
在 Lua 5.3中,由于整型总是可以被强制转换为浮点型,因此仍然可以用函数 lua_tonumber 和 “%g" 的格式打印所有的数值。但是,我们更倾向于将整数打印为整型,以避免损失精度。此时,我们可以使用 lua_isinteger 来区分整型和浮点型:
case LUA_NUMBER: { /*数值*/
if (lua_isinteger(L, i))
printf("%lld", lua_tointeger(L, i);
else
printf("%g", lua_tonumber(L, i);
break;
}