【Lua】 Lua学习笔记(八)

零、相关文章

【Lua】 Lua学习笔记(一)
【Lua】 Lua学习笔记(二)
【Lua】 Lua学习笔记(三)
【Lua】 Lua学习笔记(四)
【Lua】 Lua学习笔记(五)
【Lua】 Lua学习笔记(六)
【Lua】 Lua学习笔记(七)

一、前言

哈喽大家好,我是 FEZ98 ,今天继续系统学习Lua。这个系列是我系统学习Lua语言的学习笔记,我会把遇到的一些比较值得记录与关注的知识写在里面,供自己以后进行回顾。

二、Lua 文件 I/O

Lua I/O 库用于读取和处理文件,其分为简单模式完全模式

简单模式: 拥有一个当前输入文件和当前输出文件,并且提供针对这些文件的相关操作。
完全模式:使用外部的文件句柄来实现。以一种面对对象的形式,将所有文件操作定义为文件句柄的方法。

简单模式在做一些简单的文件操作时较为合适。但是在进行一些高级的文件操作的时候,简单模式就显得力不从心。例如同时读取多个文件这样的操作,使用完全模式则较为合适。

打开文件操作语句如下:

file = io.open (filename [, mode])

mode的值如下:
在这里插入图片描述

“r”: 读模式(默认);
“w”: 写模式;
“a”: 追加模式;
“r+”: 更新模式,所有之前的数据都保留;
“w+”: 更新模式,所有之前的数据都删除;
“a+”: 追加更新模式,所有之前的数据都保留,只允许在文件尾部做写入。

(2.1)简单模式

首先文件目录下创建一个脚本如下:
在这里插入图片描述
在这里插入图片描述
由于此时 IO_Test.lua 中没有任何数据所以读取结果为 nil,我们向 IO_Test.lua 中添加如下数据并保存。
在这里插入图片描述
结果为:
在这里插入图片描述
以附加方式打开只写文件:
在这里插入图片描述
在这里插入图片描述
在以上实例中我们使用了 io.“x” 方法,其中 io.read() 中我们没有带参数,参数可以是下表中的一个:
在这里插入图片描述
其他的 io 方法有:
在这里插入图片描述

(2.2)完全模式

如果需要在同一时间处理多个文件,需要使用 file:function_name 来代替 io.function_name 方法。
在这里插入图片描述
在这里插入图片描述
其中 io:read() 的参数如下:

  1. “n”: 读取一个数字,根据 Lua 的转换文法,可能返回浮点数或整数。 (数字可以有前置或后置的空格,以及符号。) 只要能构成合法的数字,这个格式总是去读尽量长的串; 如果读出来的前缀无法构成合法的数字 (比如空串,“0x” 或 “3.4e-”), 就中止函数运行,返回 nil。
  2. “i”: 读取一个整数,返回整数值。
  3. “a”: 从当前位置开始读取整个文件。 如果已在文件末尾,返回空串。
  4. “l”: 读取一行并忽略行结束标记。 当在文件末尾时,返回 nil 这是默认格式。
  5. “L”: 读取一行并保留行结束标记(如果有的话), 当在文件末尾时,返回 nil。
    number: 读取一个不超过这个数量字节数的字符串。 当在文件末尾时,返回 nil。 如果 number 为零, 它什么也不读,返回一个空串。 当在文件末尾时,返回 nil。
  6. 格式 "l" 和 "L" 只能用于文本文件。

完全模式的其他方法如下:

  1. file:seek(optional whence, optional offset): 设置及获取基于文件开头处计算出的位置。 设置的位置由 offset 和 whence 字符串 whence 指定的基点决定。基点可以是:
    “set”: 从文件头开始
    “cur”: 从当前位置开始[默认]
    “end”: 从文件尾开始
    当 seek 成功时,返回最终从文件开头计算起的文件的位置。 当 seek 失败时,返回 nil 加上一个错误描述字符串。
    whence 的默认值是 “cur”, offset 默认为 0 。 因此,调用 file:seek() 可以返回文件当前位置,并不改变它; 调用 file:seek(“set”) 将位置设为文件开头(并返回 0); 调用 file:seek(“end”) 将位置设到文件末尾,并返回文件大小。
  2. file:flush (): 将写入的数据保存到 file 中。
  3. io.lines(optional file name): 打开指定的文件 filename 为读模式并返回一个迭代函数,每次调用将获得文件中的一行内容,当到文件尾时,将返回 nil,并自动关闭文件。
    若不带参数时io.lines() <=> io.input():lines(); 读取默认输入设备的内容,但结束时不关闭文件。如:
	for line in io.lines("IO_Test.lua") do
		print(line)
	end

使用了 seek 方法,定位到文件倒数第 30 个位置并使用 read 方法的 *a 参数,即从当前位置(倒数第 30 个位置)读取整个文件。
在这里插入图片描述

三、Lua 错误处理

Lua 中的错误分为:语法错误和运行错误。

(3.1)语法错误

语法错误通常是由于对程序的组件(如运算符、表达式)使用不当引起的。
实例1:
在这里插入图片描述
更改后:
在这里插入图片描述

实例2;
在这里插入图片描述
更改后:
在这里插入图片描述

(3.2)运行错误

运行错误是程序可以正常执行,但是会输出报错信息。如下实例由于参数输入错误,程序执行时报错:
在这里插入图片描述
lua 里调用函数时,即使实参列表和形参列表不一致也能成功调用,多余的参数会被舍弃,缺少的参数会被补为 nil。
以上报错信息是由于参数 b 被补为 nil 后,nil 参与了 + 运算。
假如 add 函数内不是 “return a+b” 而是 “print(a,b)” 的话,结果会变成 “10 nil” 不会报错。

(3.3)错误处理

Lua 中可以使用 asserterror 来处理错误。

(3.3.1)assert

assert 首先检查第一个参数,若没问题,assert不做任何事情;否则,assert以第二个参数作为错误信息抛出。

实例1:
在这里插入图片描述

(3.3.2)error

error 语法格式如下:

error(message [, level])

功能:终止正在执行的函数,并返回message的内容作为错误信息(error函数永远都不会返回)
通常情况下,error会附加一些错误位置的信息到message头部。

Level参数指示获得错误的位置:

  1. Level=1[默认]:为调用error位置(文件+行号)
  2. Level=2:指出哪个调用error的函数的函数
  3. Level=0:不添加错误位置信息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(3.3.3)pcall

Lua中处理错误,可以使用函数pcall(protected call)来包装需要执行的代码。
pcall接收一个函数和要传递给后者的参数,并执行,执行结果:有错误、无错误;返回值true或者或false, errorinfo。
语法格式如下:

if pcall(function_name,.) then
-- 没有错误
else
-- 一些错误
end

实例:
在这里插入图片描述
pcall以一种"保护模式"来调用第一个参数,因此pcall可以捕获函数执行中的任何错误。

(3.3.4)xpcall

通常在错误发生时,希望落得更多的调试信息,而不只是发生错误的位置。但pcall返回时,它已经销毁了调用桟的部分内容。
Lua提供了 xpcall 函数,xpcall 接收第二个参数——一个错误处理函数,当错误发生时,Lua会在调用桟展开(unwind)前调用错误处理函数,于是就可以在这个函数中使用debug库来获取关于错误的额外信息了。

debug库提供了两个通用的错误处理函数:

  1. debug.debug:提供一个Lua提示符,让用户来检查错误的原因
  2. debug.traceback:根据调用桟来构建一个扩展的错误消息

实例1:
在这里插入图片描述
实例2:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43057990/article/details/132421706
LUA