首页 > 代码库 > chapter8_3 c代码和错误

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的第二个返回值。

 

chapter8_3 c代码和错误