Llamadas protegidas con pcall()
Parte de la sección Lógica y flujo 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 el programa 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 la función se ejecutó correctamente, es su valor de retorno; si se produjo 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 bloquearse, pcall() lo captura. El programa sigue ejecutándose y puede gestionar el error correctamente comprobando el valor de estado.
Ten en cuenta que pcall() captura todos los errores dentro de la llamada, incluidos los errores que no esperabas, y los notifica todos de la misma manera. Así que envuelve solo la llamada que puede fallar y, para los fallos que esperas, prefiere una función que devuelva nil y un mensaje, como en la lección anterior.
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 según la cadena de operación y, después, envuélvela con pcall() para capturar 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", 0)si lo es; de lo contrario, devuelvea / b - Para cualquier otra operación, llama a
error("Invalid operation", 0) - Usa
pcall()para ejecutar la función interna - Si la ejecución tiene éxito, devuelve
"Result: "seguido del resultado - Si se produce un error, devuelve
"Error: "seguido del mensaje de error
Pasa 0 como segundo argumento de error(). Ese argumento es el nivel de error, y 0 le indica a Lua que no anteponga el nombre del archivo ni el número de línea a tu mensaje, de modo que la cadena devuelta sea exactamente "Error: Division by zero".
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 el resultado del cálculo precedido por "Result: ", o el mensaje de error precedido por "Error: " (cadena)
Pruébalo tú mismo
function safeCalculate(operation, a, b)
-- Escribe el código aquí
-- Nota: llama a error(message, 0) para que Lua no añada el nombre del archivo ni el
-- número de línea delante de tu mensaje.
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
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