Menu
CoddyTech

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)
end

En 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.

challenge icon

Desafío

Fácil

Escribe 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 b es 0 y llama a error("Division by zero", 0) si lo es; de lo contrario, devuelve a / 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 operando
  • b (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.
end
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de Lua online