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 gestionar los errores sin que se bloquee. La función pcall() de Lua te permite ejecutar de forma segura código que podría fallar.
El nombre pcall() significa «llamada protegida». Envuelve una llamada a una función en una capa protectora que captura cualquier error. En lugar de que tu programa se bloquee, pcall() devuelve información sobre lo que ocurrió.
Esta es 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 se ejecutó correctamente, o false si se produjo un error. El segundo valor depende del estado: si se ejecutó correctamente, es el valor devuelto por 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 bloquearse, pcall() lo captura. El programa continúa ejecutándose y puede gestionar el error correctamente comprobando el valor de estado.
Desafío
FácilEscribe una función safeCalculate que acepte 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 según la cadena de operación y, después, envuélvela con pcall() para detectar cualquier error.
Lógica:
- Crea una función interna que compruebe 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", comprueba 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 se produce un error, devuelve
"Error: "seguido del mensaje de error
Parámetros:
operation(cadena): La operación que se 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 altasPractica por tu cuenta: Compilador de Lua online