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 – для інсайтів спільноти та шаблонів.