我想一段代码,我用Python写到Lua翻译。我使用合成包装的Blackmagic融合这里面的代码。
任何帮助将不胜感激!
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
Lua的异常处理的工作比在其他语言中有一点不同。相反,在包装的try / catch语句代码,你不是在pcall
一个“保护环境”运行功能。
对于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)
您未使用正确PCALL。你需要通过它,你真的想调用的函数,它会调用它在受保护的模式,它可以捕获错误。
PCALL返回两个值,一个布尔值,指示是否调用成功与否,如果呼叫没有成功的错误代码。
你的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称取PARAMS功能的情况下,你可以简单地将它们作为额外值PCALL,它会通过那些上你给它时,它调用它的方法。
local ok, err = pcall(comp.AddTool, 'PolylineMask', -32768, -32768)
举个例子。
上面的行大致翻译为:
try {
comp.AddTool('PolylineMask', -32768, -32768);
return true
}
catch (err) {
return false, err
}
注意区别:
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)
。
-- 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