2013-07-24 2 views
2

Я пытаюсь перевести фрагмент кода, который я написал из Python в Lua. Любая помощь будет принята с благодарностью! Я использую этот код внутри слияния глаз.Перевести Python на Lua - обработка ошибок

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 сценарий до сих пор, но до сих пор erroring:

if pcall (comp:ActiveTool()) then 
    print "Node Selected" 
else 
    comp:AddTool("PolylineMask", -32768, -32768) 
end 

ответ

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) 
+0

Удивительно ... Спасибо. Это хорошо работает. – iGwok

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, которые принимают Params, вы можете просто передать их как дополнительные значения для PCALL, и Я передам их методу, который вы ему дали, когда он его называет.

local ok, err = pcall(comp.AddTool, 'PolylineMask', -32768, -32768) 

в качестве примера.

выше линии примерно переводится:

try { 
    comp.AddTool('PolylineMask', -32768, -32768); 
    return true 
} 
catch (err) { 
    return false, err 
} 
+0

благодарит за быстрый ответ. Я все еще изо всех сил пытаюсь понять, что здесь происходит. Я обновил код Lua, но он по-прежнему ошибочен. Вместо ошибки я хочу запустить этот кусок кода «comp.AddTool (« PolylineMask », -32768, -32768)». Сообщение об ошибке, которое я получаю, это «попытка вызова метода« ActiveTool »(значение nil)» – iGwok

+1

ошибка, о которой вы заявляете, - это просто lua, говорящая, что объект 'comp' не имеет функции/свойства, доступной на нем, называемой' ActiveTool '. для этого может быть несколько причин. не видя больше кода, связанного с объектом 'comp', я не могу помочь вам с этой проблемой. –

+0

@ user2528059, Угадав, что вы пытаетесь сделать, вы можете использовать 'local ok, err; if comp.ActiveTool, тогда ok, err = false, "" else ok, err = pcall (comp: ActiveTool) end' ... –

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).

+1

, это не сработает. Вам нужно использовать 'comp.ActiveTool' и передать' comp' в качестве параметра (для эмуляции вызова 'comp: ActiveTool()'). –

+0

@PaulKulchenko Упс. Да, я был сосредоточен на различии между передачей функции или ее результатом на pcall. Изменился пример, чтобы сфокусироваться на этом, а затем уточнил о вызовах методов ниже. – Mud

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

Смежные вопросы