chapter8_3 c代码和错误
1、C代码
Lua提供的所有关于动态链接的功能都集中在一个函数中,即package.loadlib.
该函数有两个字符串参数:动态库的完整路径和一个函数名称:
local path = "/usr/local/lib/lua/5.3/socket.so" local f = package.loadlib(path,"luaopen_socket")
loadlib加载指定的库,并将其链接入Lua。不过,它并没有调用库中的任何函数。
相反,它是将一个 C 函数作为Lua函数返回。如果在加载库或者查找初始化函数时发生任何错误。
loadlib函数返回nil及一条错误消息。
loadlib是一个非常底层的函数。必须提供库的完整路径和正确的函数名称。
通常使用require来加载C程序库,这个函数会搜索指定的库,然后用loadlib来加载库,并返回初始化函数。
这个初始化函数从库中建立并返回一个table。并作为一个典型的Lua库使用。
2、错误
“犯错是人的天性”。
Lua是一门扩展语言,通常嵌入到应用程序中,所以当发生错误时,它不能轻易挂掉或退出。
所以,只要发生错误,Lua就应该结束当前程序块并返回到应用程序。
任何一个未预期条件都会引发一个错误:
把两个不是数字类型的值相加、
对一个不是函数的值施以调用、
操作并索引一个不是table的值。
通过调用error函数并传入一个错误消息的参数,也可以显式地引发一个错误。
print "enter a number:" n = io.read("*n") if not n then error("invalid input") end
可以用一个内建的函数assert来完成上面 if not then 的代码:
print "enter a number:" n = assert(io.read("*n"),"invalid input")
assert的第一个参数如果为true 则返回第一个参数
如果第一个参数为false 则引发一个错误并返回第二个参数。
当一个函数遇到异常时,它有两种行为:返回 nil 或者调用error返回错误。
具体使用哪种没有严格的要求,通常一个准则:很容易避免发生的应使用error返回错误。
以sin函数为例:
通常不会检查参数也不会去检查sin的返回值,如果sin的参数不是一个数字,则表明程序出了问题
此时,处理异常最简单也是最实用的做法就是停止计算,然后给出一条错误消息。
又以io.open为例:
如果文件不存在怎么办?因为没有什么简单的方法可以调用函数前检测到这种异常情况。
如果由于外部原因(不存在或拒绝访问)使open无法打开一个文件,应返回nil,并附加一条错误消息。
通过这种方式就可以有机会采取适当的做法来处理异常情况。
如果不想处理,但任想继续安全地运行程序,只需使用assert来检测操作即可。
file = assert(io.open(name,"r"))
如果open失败,assert就引发一个错误。
assert里的错误消息是 open的第二个返回值。