如何从Lua的pcall()中返回函数值

我的代码(伪代码)

function foo(cmd)
    return load(cmd) - 注意,这可能会导致错误,如果'cmd'是无效命令
end

function moo()
    return“moo”
end

function yoo(something)
    something.do()
end

cmd = io.read() - 请注意,语法错误将在load中调用错误。因此,我使用pcall()
local result,error = pcall(cmd)
print(result)

这段代码看起来不错,而且有效,但是我的问题是如果我键入'moo ()',那么'result'只会显示命令是否已执行而不出错(如果命令调用错误,则'error'将具有其值)。

另外,如果我要调用'yoo()',我将无法从中获得返回值,因此我需要'pcall()'的'true'/'false'(或任何其他替代方法而不是'pcall())

是否有另一种调用'moo()'、获得返回值并能够捕获任何错误的替代方法?

注意:我找不到任何'try-catch'等价物,除了'pcall'/'xpcall'。

点赞
用户3946812
用户3946812

有点过时,但仍然没有恰当的答案...

您需要的是load()pcall()的组合

1.使用load()将输入的字符串cmd编译成可执行的内容(函数)。 2.使用pcall()执行load()返回的函数。 3.这两个函数都可以返回错误信息。从load()获取语法错误的描述,从pcall()获取运行时错误的描述。

function moo()
  return "moo"
end

function yoo(something)
  something.do_something()
end

cmd = io.read()

-- 我们得到了一个字符串形式的命令
-- 为了能够执行它,我们必须先编译(加载)它
local cmd_fn, err = load("return " .. cmd);
if not cmd_fn then
  -- 有语法错误
  print("语法错误:"..err);
else
  -- 我们现在已经编译了函数cmd_fn()形式的cmd,因此我们可以尝试执行它
  local ok, result_or_error = pcall(cmd_fn)
  if ok then
    -- 代码已经成功执行,打印返回的值
    print("结果:"..tostring(result_or_error));
  else
    -- 运行时错误,打印错误描述
    print("运行时错误:"..result_or_error)
  end
end
2018-01-17 17:42:23