Поиск…


Использование pcall

pcall означает «защищенный вызов». Он используется для добавления обработки ошибок в функции. pcall работает аналогично try-catch на других языках. Преимущество pcall заключается в том, что полное выполнение скрипта не прерывается, если возникают ошибки в функциях, вызываемых с помощью pcall . Если ошибка внутри функции, вызванной с помощью pcall возникает ошибка, и остальная часть кода продолжает выполнение.


Синтаксис:

pcall( f , arg1,···)

Возвращаемые значения:

Возвращает два значения

  1. status (boolean)
  • Возвращает true, если функция была выполнена без ошибок.
  • Возвращает false, если внутри функции возникла ошибка.
  1. возвращаемое значение функции или сообщение об ошибке, если в функциональном блоке произошла ошибка.

pcall может использоваться для различных случаев, однако общий из них заключается в том, чтобы ловить ошибки из функции, предоставленной вашей функции. Например, скажем, у нас есть эта функция:

local function executeFunction(funcArg, times) then
    for i = 1, times do
        local ran, errorMsg = pcall( funcArg )
        if not ran then
            error("Function errored on run " .. tostring(i) .. "\n" .. errorMsg)
        end
    end
end

Когда заданные ошибки функции при запуске 3, сообщение об ошибке будет понятно пользователю, что оно не исходит от вашей функции, а от функции, которая была предоставлена ​​нашей функции. Кроме того, учитывая это, фантастический BSoD может быть уведомлен о пользователе. Однако это зависит от приложения, которое реализует эту функцию, поскольку API, скорее всего, этого не сделает.

Пример A - Исполнение без pcall

function square(a)
  return a * "a"    --This will stop the execution of the code and throws an error, because of the attempt to perform arithmetic on a string value
end

square(10);

print ("Hello World")    -- This is not being executed because the script was interrupted due to the error

Пример B - Исполнение с pcall

function square(a)
  return a * "a"
end

local status, retval = pcall(square,10);

print ("Status: ", status)        -- will print "false" because an error was thrown.
print ("Return Value: ", retval)  -- will print "input:2: attempt to perform arithmetic on a string value"
print ("Hello World")    -- Prints "Hello World"

Пример. Выполнение безупречного кода.

function square(a)
  return a * a
end

local status, retval = pcall(square,10);

print ("Status: ", status)        -- will print "true" because no errors were thrown 
print ("Return Value: ", retval)  -- will print "100"
print ("Hello World")    -- Prints "Hello World"

Обработка ошибок в Lua

Предполагая, что мы имеем следующую функцию:

function foo(tab)
  return tab.a
end -- Script execution errors out w/ a stacktrace when tab is not a table

Давайте немного поправим

function foo(tab)
  if type(tab) ~= "table" then
    error("Argument 1 is not a table!", 2)
  end
  return tab.a
end -- This gives us more information, but script will still error out

Если мы не хотим, чтобы функция выходила из строя в программе даже в случае ошибки, в lua стандартно выполнять следующие действия:

function foo(tab)
    if type(tab) ~= "table" then return nil, "Argument 1 is not a table!" end
    return tab.a
end -- This never crashes the program, but simply returns nil and an error message

Теперь у нас есть функция, которая ведет себя так, мы можем делать такие вещи:

if foo(20) then print(foo(20)) end -- prints nothing
result, error = foo(20)
if result then print(result) else log(error) end

И если мы хотим, чтобы программа потерпела крах, если что-то пошло не так, мы все равно можем это сделать:

result, error = foo(20)
if not result then error(error) end

К счастью, нам даже не нужно писать все это каждый раз; lua имеет функцию, которая выполняет именно это

result = assert(foo(20))


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow