3

我正在尝试将我从 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
4

4 回答 4

7

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可以为您调用它。

请记住,tbl:method(arg1, arg2)在 Lua 中是tbl.method(tbl, arg1, arg2). 但是,由于您不是自己调用该函数,因此您不能使用该语法。您需要将表pcall作为第一个参数传递,如下所示:

pcall(tbl.method, tbl, arg1, arg2, ...)

因此,在您的情况下,它将是:

local ok, err = pcall(comp.ActiveTool, comp)
于 2013-07-24T21:54:12.540 回答
1

您没有正确使用 pcall 。你需要将你真正想要调用的函数传递给它,它会在一个可以捕获错误的保护模式下调用它。

pcall 返回 2 个值,一个布尔值指示调用是否成功,如果调用不成功,则返回一个错误代码。

你的 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
}
于 2013-07-24T17:15:48.877 回答
1

注意区别:

pcall (foo())
pcall (foo)

第一行调用该函数foo,然后将其结果传递给pcall. 如果foo抛出错误,pcall将永远不会被调用。

第二行将函数传递foopcall. pcall来电foo。如果foo抛出错误pcall,则捕获它并返回错误消息。


在您的示例中,您正在进行方法调用,comp:ActiveTool()语法糖在哪里,因此在调用 pcall: =>comp.ActiveTool(comp)时必须考虑到这一点。comp:ActiveTool()pcall(comp.ActiveTool, comp)

于 2013-07-24T21:54:01.330 回答
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

原文https://gist.github.com/cwarden/1207556

于 2015-07-19T23:31:45.690 回答