Menu
Coddy logo textTech

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

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

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 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 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 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 operando
  • b (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: true si la función tuvo éxito, false si 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)
end

Esto 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
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 Logic & Flow