我正在尝试将我用Python写的一段代码翻译成Lua。我在合成包Blackmagic Fusion中使用此代码。
非常感谢任何帮助!
Python脚本(工作):
try:
comp.ActiveTool() # checks if a tool is selected
except:
print("nothing selected")
comp.AddTool("PolylineMask", -32768, -32768) # adds a tool if nothing's selected
Lua脚本(仍然没有工作和错误):
if pcall (comp:ActiveTool()) then
print "Node Selected"
else
comp:AddTool("PolylineMask", -32768, -32768)
end
答案 0 :(得分:7)
Lua的异常处理与其他语言的处理方式略有不同。您可以使用pcall
在“受保护的环境”中运行函数,而不是将代码包装在try / catch语句中。
pcall的一般语法是:
local ok, err = pcall(myfunc, arg1, arg2, ...)
if not ok then
print("The error message was "..err)
else
print("The call went OK!")
end
myfunc
是您要调用的函数,arg1
等等是参数。请注意,您实际上并没有调用该函数,只是将其传递给pcall
可以为您调用它。
但请注意,Lua中的tbl:method(arg1, arg2)
是tbl.method(tbl, arg1, arg2)
的语法糖。但是,由于您没有自己调用该函数,因此无法使用该语法。您需要将表作为第一个参数传递给pcall
,如下所示:
pcall(tbl.method, tbl, arg1, arg2, ...)
因此,在您的情况下,它将是:
local ok, err = pcall(comp.ActiveTool, comp)
答案 1 :(得分:1)
您没有正确使用pcall。你需要传递你实际想要调用的函数,并且它会在受保护模式下调用它,它可以捕获错误。
pcall返回2个值,bool指示调用是否成功,如果调用未成功则返回错误代码。
你的lua代码应该看起来像这样:
local ok, err = pcall(comp.ActiveTool, comp)
if not ok then
print(err, 'nothing selected')
comp.AddTool(...)
else -- the call succeeded
print 'Node Selected'
end
如果你想使用使用参数的pcall调用函数,你可以简单地将它们作为附加值传递给pcall,并且它会将它们传递给你调用它时给它的方法。
local ok, err = pcall(comp.AddTool, 'PolylineMask', -32768, -32768)
作为一个例子。
上述行大致转换为:
try {
comp.AddTool('PolylineMask', -32768, -32768);
return true
}
catch (err) {
return false, err
}
答案 2 :(得分:1)
注意区别:
pcall (foo())
pcall (foo)
第一行调用函数foo
,然后将其结果传递给pcall
。如果foo
引发错误,则永远不会调用pcall
。
第二行将函数foo
传递给pcall
。 pcall
来电foo
。如果foo
抛出错误pcall
捕获它并返回错误消息。
在您的示例中,您正在进行方法调用,其中comp:ActiveTool()
是comp.ActiveTool(comp)
的语法糖,因此您在调用pcall时必须考虑到这一点:comp:ActiveTool()
= > pcall(comp.ActiveTool, comp)
。
答案 3 :(得分:0)
-- test.lua
require "try-catch"
try {
function ()
error('oops')
end,
catch {
function (error)
print('caught error: ' .. error)
end
}
}
...
-- try-catch.lua
function catch (what)
return what[1]
end
function try (what)
status, result = pcall(what[1])
if not status then
what[2](result)
end
return result
end