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 – для общественных идей и паттернов.