Lua
Обработка ошибок
Поиск…
Использование pcall
pcall
означает «защищенный вызов». Он используется для добавления обработки ошибок в функции. pcall
работает аналогично try-catch
на других языках. Преимущество pcall
заключается в том, что полное выполнение скрипта не прерывается, если возникают ошибки в функциях, вызываемых с помощью pcall
. Если ошибка внутри функции, вызванной с помощью pcall
возникает ошибка, и остальная часть кода продолжает выполнение.
Синтаксис:
pcall( f , arg1,···)
Возвращаемые значения:
Возвращает два значения
- status (boolean)
- Возвращает true, если функция была выполнена без ошибок.
- Возвращает false, если внутри функции возникла ошибка.
- возвращаемое значение функции или сообщение об ошибке, если в функциональном блоке произошла ошибка.
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))