Llamadas protegidas con pcall()
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy — lección 33 de 54.
Mientras que error() detiene tu programa cuando algo sale mal, a veces quieres manejar los errores sin que la aplicación falle. La función pcall() de Lua te permite ejecutar de forma segura código que podría fallar.
El nombre pcall() significa "protected call" ("llamada protegida"). Envuelve una llamada a una función en una capa protectora que captura cualquier error. En lugar de que tu programa falle, pcall() devuelve información sobre lo que sucedió.
Aquí está la sintaxis básica:
local status, result = pcall(functionName, arg1, arg2)La función pcall() devuelve dos valores. El primero es un estado booleano: true si la función tuvo éxito, o false si ocurrió un error. El segundo valor depende del estado: si tuvo éxito, es el valor de retorno de la función; si hubo un error, es el mensaje de error.
Aquí tienes un ejemplo práctico:
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)
endEn este ejemplo, la división por cero desencadena un error, pero en lugar de fallar, pcall() lo captura. El programa continúa ejecutándose y puede manejar el error de forma adecuada comprobando el valor de status.
Desafío
FácilEscribe una función safeCalculate que tome operation, a y b y devuelva el resultado del cálculo o un mensaje de error.
La función debe usar pcall() para realizar de forma segura la operación matemática solicitada. Crea una función interna que realice el cálculo basándose en la cadena de la operación, después envuélvela con pcall() para capturar cualquier error.
Lógica:
- Crea una función interna que verifique el tipo de operación y realice el cálculo
- Para "add", devuelve
a + b - Para "subtract", devuelve
a - b - Para "multiply", devuelve
a * b - Para "divide", verifica si
bes 0 y llama aerror("Division by zero")si es verdadero; de lo contrario, devuelvea / b - Para cualquier otra operación, llama a
error("Invalid operation") - Usa
pcall()para ejecutar la función interna - Si tiene éxito, devuelve
"Result: "seguido del resultado - Si ocurre un error, devuelve
"Error: "seguido del mensaje de error
Parámetros:
operation(cadena): La operación a realizar ("add", "subtract", "multiply" o "divide")a(número): El primer operandob(número): El segundo operando
Devuelve: Una cadena que contiene "Result: " seguido del resultado del cálculo, o "Error: " seguido del mensaje de error (cadena)
Pruébalo tú mismo
function safeCalculate(operation, a, b)
-- Escribe código aquí
-- Note: El ejecutor de pruebas espera que el mensaje de error incluya el número de línea.
-- Asegúrate de que tu llamada a error esté en la línea esperada o usa un mensaje de error simple si el ejecutor de pruebas lo permite.
endEsta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Lógica y flujo de control
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas