Menu
Coddy logo textTech

Защищенные вызовы с pcall()

Часть раздела Logic & Flow путешествия по Lua на Coddy — урок 33 из 54.

В то время как error() останавливает вашу программу, когда что-то идет не так, иногда вы хотите обрабатывать ошибки без аварийного завершения. Функция Lua pcall() позволяет безопасно выполнять код, который может завершиться сбоем.

Название pcall() означает «защищенный вызов» (protected call). Она оборачивает вызов функции в защитный слой, который перехватывает любые ошибки. Вместо того чтобы ваша программа завершилась сбоем, pcall() возвращает информацию о том, что произошло.

Вот базовый синтаксис:

local status, result = pcall(functionName, arg1, arg2)

Функция pcall() возвращает два значения. Первое — это логический статус: true, если функция выполнена успешно, или false, если произошла ошибка. Второе значение зависит от статуса — в случае успеха это возвращаемое значение функции; если произошла ошибка, это сообщение об ошибке.

Вот практический пример:

function divide(a, b)
    if b == 0 then
        error("Cannot divide by zero")
    end
    return a / b
end

local success, result = pcall(divide, 10, 0)

if success then
    print("Result: " .. result)
else
    print("Error caught: " .. result)
end

В этом примере деление на ноль вызывает ошибку, но вместо аварийного завершения pcall() перехватывает её. Программа продолжает работу и может корректно обработать ошибку, проверив значение статуса.

challenge icon

Задание

Легко

Напишите функцию safeCalculate, которая принимает operation, a и b и возвращает результат вычисления или сообщение об ошибке.

Функция должна использовать pcall() для безопасного выполнения запрошенной математической операции. Создайте внутреннюю функцию, которая выполняет вычисление на основе строки операции, а затем оберните её в pcall(), чтобы перехватить любые ошибки.

Логика:

  • Создайте внутреннюю функцию, которая проверяет тип операции и выполняет вычисление
  • Для "add" верните a + b
  • Для "subtract" верните a - b
  • Для "multiply" верните a * b
  • Для "divide" проверьте, равен ли b значению 0, и вызовите error("Division by zero"), если это так, в противном случае верните a / b
  • Для любой другой операции вызовите error("Invalid operation")
  • Используйте pcall() для выполнения внутренней функции
  • В случае успеха верните "Result: ", за которым следует результат
  • Если произошла ошибка, верните "Error: ", за которым следует сообщение об ошибке

Параметры:

  • operation (string): Операция для выполнения ("add", "subtract", "multiply" или "divide")
  • a (number): Первый операнд
  • b (number): Второй операнд

Возвращает: Строку, содержащую либо "Result: ", за которым следует результат вычисления, либо "Error: ", за которым следует сообщение об ошибке (string)

Шпаргалка

Функция pcall() (protected call — защищенный вызов) позволяет безопасно выполнять код, который может завершиться ошибкой, не вызывая сбоя программы.

Базовый синтаксис:

local status, result = pcall(functionName, arg1, arg2)

pcall() возвращает два значения:

  • status: true, если функция выполнена успешно, false, если произошла ошибка
  • result: возвращаемое значение функции в случае успеха или сообщение об ошибке, если произошла ошибка

Пример:

function divide(a, b)
    if b == 0 then
        error("Cannot divide by zero")
    end
    return a / b
end

local success, result = pcall(divide, 10, 0)

if success then
    print("Result: " .. result)
else
    print("Error caught: " .. result)
end

Это перехватывает ошибку вместо сбоя, позволяя программе продолжить работу и корректно обработать ошибку.

Попробуйте сами

function safeCalculate(operation, a, b)
    -- Напишите код здесь
end
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Logic & Flow