Lua:
Обробка помилок

Як це робити:

Lua використовує дві основні функції для обробки помилок: pcall та xpcall. Ось як вони використовуються:

function might_fail()
    if math.random() > 0.5 then
        error("Ой! Щось пішло не так.")
    else
        print("Все добре!")
    end
end

-- Використання pcall
local success, errorMessage = pcall(might_fail)

if success then
    print("Успіх!")
else
    print("Помилка перехоплена:", errorMessage)
end

-- Використання xpcall з обробником помилок
function myErrorHandler(err)
    print("Обробник помилок каже:", err)
end

local status = xpcall(might_fail, myErrorHandler)
print("Чи був виклик успішний?", status)

Приклад виводу може бути:

Помилка перехоплена: Ой! Щось пішло не так.
Обробник помилок каже: Ой! Щось пішло не так.
Чи був виклик успішний? false

Або, якщо помилки не відбувається:

Все добре!
Успіх!
Все добре!
Чи був виклик успішний? true

Поглиблено

Обробка помилок або “керування винятками” раніше не завжди використовувалася. Ранні програми часто «падали». Разом із розвитком програмування зросла й потреба у стабільності. Підхід Lua до обробки помилок є простим порівняно з деякими іншими мовами. Немає блоків try/catch, тільки pcall та xpcall. Перший захищає виклик функції, повертаючи статус і будь-яку помилку. Другий додає функцію обробки помилок, корисну для власного очищення або логування.

Альтернативою у Lua є використання assert, яке може виконувати подібну роль, викидаючи помилку, якщо умова є неправдивою. Але це не так гнучко, як pcall для складних сценаріїв обробки помилок.

Внутрішньо, pcall і xpcall працюють, створюючи “захищене середовище” для виконання функції. Якщо з’являється помилка, середовище її зловлює і може або вирішити прямо там, або передати її назад програмі для обробки.

Дивіться також

  • Книга “Програмування на Lua” (третє видання), доступна на сайті https://www.lua.org/pil/ для детального ознайомлення з обробкою помилок (Розділ 8.4).
  • Офіційний посібник Lua 5.4: https://www.lua.org/manual/5.4/ - для найбільш актуальної інформації про функції обробки помилок Lua.
  • Вікі користувачів Lua про обробку помилок: http://lua-users.org/wiki/ErrorHandling – для інсайтів спільноти та шаблонів.