处理 Lua 中的错误

假设我们有以下功能:

function foo(tab)
  return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table

让我们改进一下吧

function foo(tab)
  if type(tab) ~= "table" then
    error("Argument 1 is not a table!", 2)
  end
  return tab.a
end -- This gives us more information, but script will still error out

如果我们不希望函数在出现错误的情况下使程序崩溃,那么在 lua 中执行以下操作是标准的:

function foo(tab)
    if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
    return tab.a
end -- This never crashes the program, but simply returns nil and an error message

现在我们有一个行为类似的函数,我们可以这样做:

if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end

如果我们确实希望程序在出现问题时崩溃,我们仍然可以这样做:

result, error = foo(20)
if not result then error(error) end

幸运的是,我们甚至不必每次都写出这一切; lua 有一个功能正是这样做的

result = assert(foo(20))