日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua 收不到服务器发来消息,lua 学习之错误处理

發布時間:2025/4/5 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua 收不到服务器发来消息,lua 学习之错误处理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

錯誤處理

動態鏈接

在 Lua 中,動態鏈接被視為所有其他機制的母機制

因此利用它就可以動態地加載任何其他不在 Lua 中的機制

package.loadlib 所需兩個參數

庫的完整路徑

正確的函數名稱

loadlib 函數加載指定的庫,并將其鏈接入 Lua

它沒有調用庫中的任何函數

而是將一個 C 編寫的函數作為 Lua 函數返回

如果加載庫或查找初始化函數時發生錯誤,會返回 nil 及一條錯誤信息

local path = "c:/lua/5.1/socket.so"

local f = package.loadlib(path, "luaopen_socket")

通常使用 require 來加載 C 程序庫,這個函數會搜索指定的庫

然后用 loadlib 加載庫,并返回初始化函數

這個初始化函數應將庫中提供的函數注冊到 Lua 中,就類似 Lua 代碼塊中定義了其他函數

錯誤

Lua 是一種擴展語言,通常嵌入在應用程序中

如果發生錯誤時如果直接崩潰或退出,那么我們就無法捕獲到錯誤出現在哪里

因此 Lua 只要發生一個錯誤,就應該結束當前程序塊并返回應用程序

Lua 中任何未預期條件都會引發一個錯誤,如:

將兩個非數字的值相加

對一個不是函數的值進行調用操作

索引一個不是 Table 的值

可以通過調用 error 函數,顯式地引發發一個錯誤

需要傳入一個錯誤消息的函數

do

print("enter a number:")

n = io.read("*number")

if not n then

error("invalid input")

end

end

-- 與上述代碼等效

do

print("enter a number:")

n = assert(io.read("*number"), "invalid input")

end

assert 如果第一個參數為 true 則返回該參數

如果第一個參數為 false 或 nil 就會引發一個錯誤

第二個參數為一個可選的信息字符串

在調用 assert 時會對其參數求值

下述代碼中,即使 n 是數字類型, Lua 也會進行字符串連接

n = io.read()

assert(tonumber(n), "invalid input:" .. n .. " is not a number")

當一個函數遭遇了一種未預期的情況即「異常」,可以采取兩種基本行為

返回錯誤代碼 (通常是 nil)

引發一個錯誤(調用 error)

sin 傳入 table 作為參數

-- 返回一個錯誤代碼,檢查 sin 函數返回值

local res = math.sin(x)

if not res then

end

-- 調用 sin 之前,檢查參數

if not tonumber(x) then

end

通常既不檢查參數也不會檢查 sin 的返回值

可以停止計算,然后給出錯誤消息

io.open 文件不存在的情況或拒絕訪問時的異常行為

一個文件存在與否可以用是否能夠打開來驗證

當 io.open 無法打開一個文件時,應返回 nil ,并附加一條錯誤消息

do

local file, msg

repeat

print("enter a file name:")

local name = io.read()

if not name then

return

end

-- io.open 第一個參數為文件路徑,第二個參數為打開模式,r 為字符模式

-- io.open 成功則返回文件句柄,無法打開會返回 nil 和錯誤消息

file, msg = io.open(name, "r")

if not file then

print(msg)

end

until file

end

-- 等效于上述代碼.錯誤消息時 io.open 的第二個返回值,并成為了 assert 的第二個參數

do

local file, msg

repeat

print("enter a file name:")

local name = io.read()

if not name then

return

end

file = assert(io.open(name, "r"))

until file

end

錯誤處理與異常

大多數情況無需在,Lua 中作任何錯誤處理,由調用 Lua 的應用程序來負責

因為所有的 Lua 活動都是由應用程序的一次調用而開始的

通常是要求 Lua 執行一個程序塊

如果發生錯誤,此調用就會返回錯誤代碼,并由應用程序處理

在解釋器程序中發生錯誤時,主循環會打印錯誤消息,然后繼續顯示提示符,并等待執行后續命令

在 Lua 中處理錯誤,必須使用 pcall 來包裹要執行的代碼, p-->意為 protect 保護的意思

pcall 可以捕獲函數執行時引發的任何錯誤

如果沒有錯誤,就會返回 true 以及函數調用的返回值

如果有錯誤,就會返回 false 以及錯誤消息

-- 執行一段 Lua 代碼,捕獲所有執行中發生的錯誤,需先將這段代碼封裝到一個函數中

function foo()

if 未預期的條件 then

error()

end

print(a[i]) -- 潛在的錯誤,a 可能不是一個 table

end

if pcall(foo) then

-- 執行 foo 時沒有發生錯誤

else

-- foo 引發了一個錯誤,進行錯誤處理

end

調用 pcall 時可以傳入一個匿名函數

「錯誤消息」可以是任何值,并將其傳遞給 error 函數,這些值也就成為 pcall 的返回值

if pcall (function ()

--

return 20 + 10 -- 用于測試的代碼 "a" + 10

end) then

--

print("ok")

else

--

print("error")

end

do

local status, err = pcall(function ()

error({code = 121})

end)

print(status, err.code)

end

在 Lua 中一個完整異常處理流程通常是:

使用 error 來拋出異常

使用 pcall 來捕獲異常

錯誤消息用來標識錯誤類型或內容

錯誤消息與追溯

錯誤消息通常是一個描述出錯內容的字符串

Lua 遇到一個內部錯誤,如索引一個非 table 的值,就會產生錯誤消息

其他情況下是錯誤消息是傳遞給 error 函數的值

只要錯誤消息是一個字符串,Lua 就會附加一些錯誤發生位置的信息

do

local status, err = pcall(function () a ="a"+1 end)

print(err)

end

do

local status, err = pcall(function ()

error("my error")

end)

print(err)

end

-- 位置信息包含文件名 stdin 及行號 3

-- stdin:3: my error

error 函數的第二個參數 level ,用于指出應有調用層級中的那個(層)函數來報告當前的錯誤,即誰為錯誤負責

-- 在一個函數中,一開始就檢查傳入參數是否正確

do

function foo(str)

if type(str) ~= "string" then

-- 不加第二個參數,則認為是讀函數時出錯并報告錯誤, stdin:3: string expected

-- error("string expected")

-- 加上第二個參數,則認為是在調用層出錯并報告錯誤, stdin:9: string expected

error("string expected", 2)

end

print(str)

end

foo({x = 1})

end

pcall 函數返回錯誤消息時,它已經銷毀了調用棧的部分內容

如果要獲取完整的追溯到發生錯誤時的函數調用情況,而不是僅僅獲取到錯誤發生的位置,需要用到 xpcall 函數

xpcall 函數接受兩個參數

需要被調用的函數

以及一個錯誤處理函數

發生錯誤時,Lua 會在調用棧展開前調用錯誤處理函數,就可以用 debug 庫來獲取錯誤的額外信息

debug 庫的兩個通用處理函數

debug.debug ,提供一個 Lua 提示符,讓用戶檢查錯誤的原因

debug.traceback ,根據調用棧來構建一個擴展的錯誤消息

解釋器程序使用 debug.traceback 來構建其錯誤消息

任何時候調用 debug.traceback 都可以獲取當前執行的調用棧

do

local t = {2, 4, 6, 8 ,10}

for i,v in ipairs(t) do

print(i, v)

print(debug.traceback())

end

end

本篇文章由一文多發平臺ArtiPub自動發布

總結

以上是生活随笔為你收集整理的lua 收不到服务器发来消息,lua 学习之错误处理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成年人91视频 | av在线色 | 日韩成人一区二区三区 | 不卡免费av | 91精品啪在线观看国产线免费 | 久草福利免费 | 国产三级精品三级 | 亚洲熟妇av一区二区三区漫画 | 亚洲一区二区三区在线看 | 日韩涩 | aaa级黄色片 | 精品三级av | 波多野结衣在线免费观看视频 | 亚洲国产日韩a在线播放性色 | 四季av一区二区凹凸精品 | a v视频在线观看 | av字幕在线 | free性护士vidos猛交 | 中文字幕第22页 | 天天草天天操 | 天堂www中文在线资源 | 亚洲精品一区二区三区蜜桃久 | 天天天操| 日本裸体网站 | 超碰超碰超碰超碰 | 91最新地址永久入口 | 光棍影院av | 天天干天天干 | xxx日韩 | 亚洲一区二区精品在线 | 亚洲成人一二三 | 五月综合激情日本mⅴ | 国产专区欧美专区 | 沈樵精品国产成av片 | 久久久久久久久久久久 | 成人亚洲电影 | 国产欧美网站 | 99久久网站 | 午夜色av | av资源首页 | 成年人免费高清视频 | 亚洲欧美自拍偷拍 | 美女无遮挡网站 | 伊人久久97 | 久久精品无码Av中文字幕 | 国产午夜亚洲精品午夜鲁丝片 | 六十路息与子猛烈交尾 | 日啪 | 熟妇无码乱子成人精品 | 欧美色第一页 | 色播欧美| 日本黄色中文字幕 | 疯狂做爰的爽文多肉小说王爷 | 伊人开心网 | 日本国产精品 | 欧美日在线观看 | 中文字幕人妻精品一区 | 欧美精品www | 日韩一级片免费观看 | 99爱爱| 91精品国产91久久久久久久久久久久 | 国产一区二区免费看 | 成人片片| 亚洲国产日韩a在线播放性色 | www.亚洲免费 | 天天操综合网 | 国产在线视频你懂的 | 精品人妻互换一区二区三区 | 丝袜脚交国产在线观看 | 国产成人高清 | 天堂中文网 | www.污在线观看 | 男女瑟瑟网站 | 国产调教一区 | 日韩av电影手机在线观看 | 久久精品视频3 | 亚洲男人天堂久久 | 国产精品日日做人人爱 | 日本伦理中文字幕 | 理论片午午伦夜理片影院99 | 性欧美videossex精品 | 青青草成人免费视频 | 伊人春色影院 | 性生活av | 黑人狂躁日本妞hd | 国产精品亚洲天堂 | 可以在线观看的黄色 | 国产区久久 | 国产亚洲av片在线观看18女人 | 一区二区免费在线视频 | 好吊色这里只有精品 | 热久久免费视频 | www.成年人| 国产精品成人国产乱一区 | 久久婷婷丁香 | 国产又粗又猛又爽又黄av | 欧美人妖另类 | 不卡免费视频 | 久久99精品波多结衣一区 |