第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于后续版本,但有一些区别。
第四版针对 Lua 5.3,可以在 亚马逊 和其他书店购买。
购买本书,您还可以帮助支持 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捕获异常。错误消息标识错误的类型或错误。