人類總是會犯錯。我們也不例外。程式設計的一個重要方面是錯誤處理。Lua 提供了多種機制來正常處理錯誤。這樣您就可以創建更可靠和可維護的代碼。在本教程中,我將與您分享 Lua 中錯誤處理的主要技術。您將學習類似 pcall
, xpcall
和 assert
函數 的內容。
使用 「pcall」 進行錯誤處理
這 pcall
稱為 protected 調用。它是一個允許您在 保護模式下調用函數的函數。試想一下,如果你犯了一個錯誤,該函數會拋出一個錯誤並 pcall
捕獲它,並返回一個狀態代碼和錯誤消息。讓我們看一下基本語法:
local status, result = pcall(function)
在上面的代碼行中, status
是一個布爾值,指示函數調用是否成功。如果成功,則 result
包含函數的返回值。或者,如果出現問題,它包含錯誤消息。讓我們看下面的示例來演示它是如何工作的:
Lua 錯誤處理範例
local function divide(a, b)
if b == 0 then
error("Division by zero!")
end
return a / b
end
local status, result = pcall(divide, 10, 0)
if status then
print("Result: " .. result)
else
print("Error: " .. result)
end
你知道數學,當分母為零時會導致錯誤。該函數 pcall
捕獲 「Division by zero!“ 錯誤,並列印出錯誤消息。
使用 xpcall 進行錯誤處理
現在讓我們向前邁進一步。該函數 xpcall
通過允許您指定錯誤處理程式來擴展 pcall
的功能。更具體地說,此處理程式可以提供更詳細的錯誤資訊或在發生錯誤時執行其他操作。語法與 pcall
local status, result = xpcall(function, errorHandler)
errorHandler 是一個在發生錯誤時調用的函數。讓我們看看它的實際效果。
Lua xpcall 示例
local function divide(a, b)
if b == 0 then
error("Again, division by zero is not allowed!")
end
return a / b
end
local function errorHandler(err)
return "Error handled: " .. err
end
local status, result = xpcall(divide, errorHandler, 850, 0)
if status then
print("Result: " .. result)
else
print(result) -- Output: Error handled: Division by zero!
end
所以你可以看到,在這個例子中,errorHandler 函數自定義了錯誤消息。您可以更改任何您想要的措辭。
在 Lua 中使用 assert 進行簡單錯誤檢查
有時,我們可能只需要檢查是否有錯誤,而沒有太多細節。然後你就可以使用該功能 assert
了。它檢查條件,如果條件為 false,則引發錯誤。它對於簡單的驗證檢查很有用。語法非常簡單明瞭。
assert(condition, message)
第一個參數 condition 是要檢查的表達式。第二個參數 消息 是條件為 false 時要引發的錯誤消息。下面是一個演示如何使用 assert() 函數的範例。
使用 assert() 檢查錯誤
local function divide(a, b)
assert(b ~= 0, "Division by zero!")
return a / b
end
local result = divide(999, 0) -- This will throw an error: Division by zero!
print("The Result: " .. result)
在此示例中, assert
如果條件 b ~= 0
為 false,則引發錯誤並顯示消息 “Division by zero!”。
帶錯誤的 Lua 自定義錯誤處理
除了上面提到的方法之外,您還可以使用該 error
函數在代碼中引發自定義錯誤。通過這種方式,您可以提供特定的錯誤消息並控制錯誤發生的時間。讓我們看看語法:
error(message, level)
直截了當地說, message
是錯誤消息。並 level
指定產生錯誤的堆疊級別(這是可選的)。
Lua 自定義錯誤範例
local function sqrt(number)
if number < 0 then
error("Cannot calculate the square root of a negative number!", 2)
end
return math.sqrt(number)
end
local status, result = pcall(sqrt, -9)
if status then
print("Result: " .. result)
else
print("Error: " .. result)
end
該 sqrt
函數計算數位的平方根。如果數位為負數,則使用 error()
該函數會引發錯誤。另一方面, pcall
用於在保護模式下調用 sqrt
函數。這將捕獲任何錯誤並防止腳本崩潰。
因此,如果 status 為 true,則列印結果,否則列印錯誤消息。
㯱
請記住,有效的錯誤處理非常重要。它可以幫助您節省大量時間來調試代碼。通過使用上述pcall
、 、 xpcall
assert
和 error
,您可以正常處理錯誤,提供有意義的錯誤訊息,並確保即使在意外情況下也能順利運行代碼。