iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Software Development

在麥塊的農場裡寫 Lua系列 第 17

Day17 將電腦接上喇叭 - 談 Lua 的錯誤處理

  • 分享至 

  • xImage
  •  

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 ?

今天的研究就到這裡,下次來玩印表機吧!


上一篇
Day16 中斷 Lua 的執行 - coroutine
下一篇
Day18 將電腦接上印表機,將程式碼或文章包裝成書吧
系列文
在麥塊的農場裡寫 Lua30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言