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

  • 相关阅读:
    Java运行时数据区
    关于Java中的内存屏障
    Java中对象在内存中的大小、分配等问题
    【java基础】两个日期的比较大小的几种方法。
    报错信息: java.sql.SQLException: 不支持的字符集 (在类路径中添加 orai18n.jar): ZHS16GBK
    linux 中文件按照时间倒序或者升序显示
    maven本地仓库存在为什么还要连接外网下载?
    【奇奇怪怪的代码问题】-springboot前后端时间不一致
    日常问题-使用maven jetty插件启动慢的一些解决方法
    Mybatis 框架下 SQL 注入攻击的 3 种方式
  • 原文地址:https://www.cnblogs.com/daiker/p/5817305.html
Copyright © 2020-2023  润新知