第一版是為 Lua 5.0 編寫的。儘管在很大程度上仍然適用於後續版本,但仍有一些區別。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還將幫助 支持 Lua 項目


8.4 – 錯誤處理和異常

對於許多應用程序,您不需要在 Lua 中執行任何錯誤處理。通常,應用程序會執行此處理。所有 Lua 活動都從應用程序的呼叫開始,通常要求 Lua 運行一個塊。如果出現任何錯誤,此呼叫將返回一個錯誤代碼,應用程序可以採取適當的措施。對於獨立解釋器,其主循環只會列印錯誤訊息,並繼續顯示提示符和運行命令。

如果您需要在 Lua 中處理錯誤,您應該使用 pcall 函數(受保護的呼叫)來封裝您的代碼。

假設您想運行一段 Lua 代碼,並捕獲運行該代碼時引發的任何錯誤。您的第一步是將該段代碼封裝在一個函數中;我們稱之為 foo

    function foo ()
        ...
      if unexpected_condition then error() end
        ...
      print(a[i])    -- potential error: `a' may not be a table
        ...
    end
然後,您使用 pcall 呼叫 foo
    if pcall(foo) then
      -- no errors while running `foo'
      ...
    else
      -- `foo' raised an error: take appropriate actions
      ...
    end
當然,您可以使用匿名函數呼叫 pcall
    if pcall(function () ... end) then ...
    else ...

pcall 函數以受保護模式呼叫其第一個參數,以便在函數運行時捕獲任何錯誤。如果沒有錯誤,pcall 返回 true,以及呼叫返回的任何值。否則,它返回 false,以及錯誤訊息。

儘管其名稱為錯誤訊息,但它不必是字串。您傳遞給 error 的任何 Lua 值都將由 pcall 返回

    local status, err = pcall(function () error({code=121}) end)
    print(err.code)  -->  121
這些機制提供了我們在 Lua 中執行異常處理所需的一切。我們使用 error拋出異常,並使用 pcall捕獲異常。錯誤訊息識別錯誤的類型或錯誤。