El manejo de errores es una parte crucial de cualquier lenguaje de programación, y Lua no es una excepción. En este módulo, aprenderemos cómo Lua maneja los errores y cómo podemos escribir código robusto que pueda manejar situaciones inesperadas de manera efectiva.

Contenido

Introducción al Manejo de Errores

En Lua, los errores pueden ocurrir por diversas razones, como intentos de acceder a variables no definidas, errores de sintaxis, o problemas en la lógica del programa. Lua proporciona varias herramientas para manejar estos errores de manera efectiva.

Tipos de Errores Comunes

  • Errores de Sintaxis: Ocurren cuando el código no sigue las reglas del lenguaje.
  • Errores de Ejecución: Ocurren durante la ejecución del programa, como intentar dividir por cero.
  • Errores Lógicos: Ocurren cuando el código no produce el resultado esperado debido a un error en la lógica.

Uso de pcall y xpcall

Lua proporciona dos funciones principales para manejar errores: pcall (protected call) y xpcall (extended protected call).

pcall

La función pcall ejecuta una función en modo protegido, lo que significa que cualquier error que ocurra dentro de la función no detendrá el programa, sino que será capturado y manejado.

local status, result = pcall(function()
    -- Código que puede generar un error
    return 10 / 0
end)

if status then
    print("Resultado:", result)
else
    print("Error:", result)
end

xpcall

La función xpcall es similar a pcall, pero permite especificar una función de manejo de errores personalizada.

local function errorHandler(err)
    return "Error capturado: " .. err
end

local status, result = xpcall(function()
    -- Código que puede generar un error
    return 10 / 0
end, errorHandler)

if status then
    print("Resultado:", result)
else
    print(result)
end

Generación de Errores con error

La función error se utiliza para generar errores de manera explícita. Esto es útil cuando queremos validar condiciones específicas y generar un error si no se cumplen.

local function divide(a, b)
    if b == 0 then
        error("División por cero no permitida")
    end
    return a / b
end

local status, result = pcall(divide, 10, 0)
if status then
    print("Resultado:", result)
else
    print("Error:", result)
end

Ejemplos Prácticos

Ejemplo 1: Manejo de Errores en Lectura de Archivos

local function readFile(filename)
    local file, err = io.open(filename, "r")
    if not file then
        error("No se pudo abrir el archivo: " .. err)
    end
    local content = file:read("*a")
    file:close()
    return content
end

local status, content = pcall(readFile, "archivo_inexistente.txt")
if status then
    print("Contenido del archivo:", content)
else
    print("Error:", content)
end

Ejemplo 2: Uso de xpcall con Función de Manejo de Errores

local function errorHandler(err)
    return "Error capturado: " .. err
end

local function riskyFunction()
    error("Algo salió mal")
end

local status, result = xpcall(riskyFunction, errorHandler)
if status then
    print("Resultado:", result)
else
    print(result)
end

Ejercicios

Ejercicio 1: Manejo de Errores en Función de División

Escribe una función safeDivide que tome dos números y devuelva su cociente. Si el divisor es cero, la función debe generar un error. Usa pcall para manejar el error.

local function safeDivide(a, b)
    -- Tu código aquí
end

local status, result = pcall(safeDivide, 10, 0)
if status then
    print("Resultado:", result)
else
    print("Error:", result)
end

Solución

local function safeDivide(a, b)
    if b == 0 then
        error("División por cero no permitida")
    end
    return a / b
end

local status, result = pcall(safeDivide, 10, 0)
if status then
    print("Resultado:", result)
else
    print("Error:", result)
end

Ejercicio 2: Lectura Segura de Archivos

Escribe una función safeReadFile que tome un nombre de archivo y devuelva su contenido. Si el archivo no existe, la función debe generar un error. Usa xpcall para manejar el error con una función de manejo de errores personalizada.

local function safeReadFile(filename)
    -- Tu código aquí
end

local function errorHandler(err)
    return "Error capturado: " .. err
end

local status, content = xpcall(safeReadFile, errorHandler, "archivo_inexistente.txt")
if status then
    print("Contenido del archivo:", content)
else
    print(content)
end

Solución

local function safeReadFile(filename)
    local file, err = io.open(filename, "r")
    if not file then
        error("No se pudo abrir el archivo: " .. err)
    end
    local content = file:read("*a")
    file:close()
    return content
end

local function errorHandler(err)
    return "Error capturado: " .. err
end

local status, content = xpcall(safeReadFile, errorHandler, "archivo_inexistente.txt")
if status then
    print("Contenido del archivo:", content)
else
    print(content)
end

Conclusión

En esta sección, hemos aprendido cómo manejar errores en Lua utilizando pcall y xpcall, así como cómo generar errores explícitamente con error. Estas herramientas son esenciales para escribir código robusto y confiable. Asegúrate de practicar los ejercicios para consolidar tu comprensión y estar preparado para manejar errores en tus propios proyectos.

En el próximo módulo, exploraremos cómo trabajar con archivos en Lua, lo que nos permitirá leer y escribir datos de manera efectiva.

© Copyright 2024. Todos los derechos reservados