Llamadas protegidas con pcall()
Parte de la sección Logic & Flow 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 errores sin que este falle. La función pcall() de Lua te permite ejecutar de forma segura código que podría fallar.
El nombre pcall() significa "llamada protegida" (protected call). 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 ocurrió.
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 tiene é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 provoca un error, pero en lugar de cerrarse inesperadamente, pcall() lo captura. El programa continúa ejecutándose y puede manejar el error de manera controlada al verificar el valor de estado.
Desafío
FácilEscribe una función safeCalculate que reciba 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 operación, luego 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(string): La operación a realizar ("add", "subtract", "multiply" o "divide")a(number): El primer operandob(number): El segundo operando
Devuelve: Una cadena que contiene "Result: " seguido del resultado del cálculo, o "Error: " seguido del mensaje de error (string)
Hoja de referencia
La función pcall() (llamada protegida) te permite ejecutar de forma segura código que podría fallar sin que tu programa se bloquee.
Sintaxis básica:
local status, result = pcall(functionName, arg1, arg2)pcall() devuelve dos valores:
- status:
truesi la función tuvo éxito,falsesi ocurrió un error - result: El valor de retorno de la función si tuvo éxito, o el mensaje de error si ocurrió un error
Ejemplo:
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)
endEsto captura el error en lugar de bloquearse, permitiendo que el programa continúe y maneje el error de manera adecuada.
Pruébalo tú mismo
function safeCalculate(operation, a, b)
-- Escribe el código aquí
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
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