Menu
Coddy logo textTech

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

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

challenge icon

Desafío

Fácil
Escribe 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 b es 0 y llama a error("Division by zero") si es verdadero; de lo contrario, devuelve a / 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 operando
  • b (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.
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 de control

Practica por tu cuenta: Compilador de Lua online