Защищенные вызовы с 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() перехватывает её. Программа продолжает работу и может корректно обработать ошибку, проверив значение статуса.
Задание
ЛегкоНапишите функцию 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
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Logic & Flow
1Продвинутая итерация таблиц
Итерация с помощью pairs()Итерация с помощью ipairs()pairs() против ipairs()Повторение — Лист персонажа2Дополнительные функции библиотеки table
table.concat()Создание таблиц и unpack()table.sort()Пользовательская сортировка с помощью функцийИтоги — Таблица рекордов