Day17 将电脑接上喇叭 - 谈 Lua 的错误处理

pcall, xpcall, debug

今天我想来玩玩麦块的喇叭,然後再继续探索 Lua 的语法
在麦块里面,我们本来就可以透过 playsound 指令播放各种音效
例如播放牛牛的哞哞叫

/playsound minecraft:entity.cow.ambient block @a ~ ~ ~ 1 1

详细指令语法可参考 麦块 playsound

CC: Tweaked 工具箱的 Speaker,就提供我们用程序化的方式来播放音效
会更有弹性
和电脑组装的方式,跟磁碟机一样,可接在电脑任何方位
如图,我将喇叭接在电脑右方
CC: Tweaked Speaker

操作 CC: Tweaked 的喇叭播放音效

Speaker 也是电脑的周边设备,跟 Disk Drive, Monitor 一样
目前看来 CC: Tweaked 的设计就是
这些周边设备都必须透过 peripheral.wrap 包装後使用
方法的参数跟麦块本身的 playsound 指令非常像
最後面也是音量 0 ~ 1,音调 0 ~ 2

peripheral.wrap('right').playSound('minecraft:entity.cow.ambient', 1, 2)

除了各种环境、动物、动作音效外,Speaker 也可以播放各种乐器声音
这部分就像是麦块的音阶盒一样
例如这是播放吉他的声音

peripheral.wrap('right').playNote('guitar', 1.0, 1.0)

第一个参数当然就是乐器种类了
可以播放的乐器参数有 "harp", "bass", "snare", "hat", "basedrum", "flute", "bell", "chime", "guitar",这部分是透过 help speakers 查询得知
第二个参数是音量大小,一样也是 0 ~ 1
第二个参数是音调高低,也就是可以透过高低音来演奏 Do Re Mi Fa So ...
实测数值是落在 0 ~ 24,数字再调上去的声音就都一样了

然而如果连续播放
会发现电脑几乎同一时间执行
导致声音都夹杂在一起了
可以故意设个停留时间

for i = 1, 10, 1 do
    peripheral.wrap('right').playNote('flute', 1.0, i)
    sleep(0.5)
end

这边的 sleep 是 bios.lua 定义的函数,也是 CC: Tweaked 写好可直接呼叫的

Lua 的错误处理

接下来我想继续看错误处理,这在上一回已经简单介绍过 pcall 语法
有着其他语言 try catch 的作用,可避免程序意外结束
pcall 就是 protected call 的意思

status, value = pcall(f, arg1, ...)

另外有个 xpcall,不一样的地方就是可以传入一个 message handler
定义如下

status, value = xpcall(f, msgh, arg1, ...) end

直接看范例,中间的 message handler 函数可自订,这里我直接用 Lua 的 debug 函式库
当发生错误时,会自动呼叫 message handler

div = function(a, b)
    return a / b
end

ok, result = xpcall(div, debug.traceback, 10, "abc")
print(ok)
print(result)

上述的错误讯息大概长这样,我们可以透过 debug.traceback 知道指令大概的执行流程
以及错误细节

false
input:2: attempt to div a 'number' with a 'string'
stack traceback:
	[C]: in metamethod 'div'
	input:2: in function 'div'
	[C]: in function 'xpcall'
	input:5: in main chunk
	[C]: in function 'pcall'
	demo.lua:60: in main chunk
	[C]: in ?

今天的研究就到这里,下次来玩印表机吧!


<<:  #16-载入炫起来!水滴状Loading特效(SVG filter)

>>:  【在厨房想30天的演算法】Day 17 演算法 : 搜寻 search I 线性搜寻、二分搜寻

[Day27]- 新手的Web系列CRLF 0x2

Day27- 新手的Web系列CRLF 0x2 正文 CRLF Injection原理 HTTP H...

近似最短路径 (7)

11.6a 把树合并起来 让我们简单描述一下把树合并起来的过程,补上昨天 Peleg’s Dista...

Day06 - 根据需求画出 Flowchart 或是 State Diagram

今天尝试将 2D RPG 角色移动模组根据规格画出 Flowchart 和 State Diagra...

进实验室啦!

小弟我进实验室的时间是在资料结构期中考的前後两周,至於为什麽进实验室与大学生在实验室做什麽,我会在文...

【Day23-降维】相信你的眼睛,在训练模型之前一定要做的事情——利用降维技巧检视资料分群状态:PCA, tSNE, SVD, SOM

昨天我们稍微讲了一下如何透过一些基本的图来让在做资料分析的时候有一个初步的认识 但有的时候我们的资料...