La gestió d'errors és una part fonamental de qualsevol llenguatge de programació, i Lua no és una excepció. En aquest tema, aprendrem com Lua maneja els errors i com podem escriure codi robust que pugui gestionar situacions inesperades de manera elegant.

Conceptes Clau

  1. Errors en Lua: Lua utilitza una funció anomenada error per generar errors.
  2. Funció pcall: La funció pcall (protected call) s'utilitza per capturar errors sense interrompre l'execució del programa.
  3. Funció xpcall: Similar a pcall, però permet especificar una funció de maneig d'errors personalitzada.
  4. Missatges d'Error: Com interpretar i utilitzar els missatges d'error per depurar el codi.

Errors en Lua

En Lua, els errors es generen utilitzant la funció error. Aquesta funció accepta un missatge d'error com a argument i interromp l'execució del programa.

Exemple

function divide(a, b)
    if b == 0 then
        error("No es pot dividir per zero")
    else
        return a / b
    end
end

print(divide(10, 2))  -- Sortida: 5
print(divide(10, 0))  -- Error: No es pot dividir per zero

En aquest exemple, si b és zero, la funció error genera un missatge d'error i interromp l'execució.

Funció pcall

La funció pcall s'utilitza per capturar errors sense interrompre l'execució del programa. Aquesta funció executa una altra funció en un mode protegit i retorna un booleà que indica si l'execució va ser exitosa o no.

Exemple

function divide(a, b)
    if b == 0 then
        error("No es pot dividir per zero")
    else
        return a / b
    end
end

local status, result = pcall(divide, 10, 2)
if status then
    print("Resultat: " .. result)  -- Sortida: Resultat: 5
else
    print("Error: " .. result)
end

local status, result = pcall(divide, 10, 0)
if status then
    print("Resultat: " .. result)
else
    print("Error: " .. result)  -- Sortida: Error: No es pot dividir per zero
end

Funció xpcall

La funció xpcall és similar a pcall, però permet especificar una funció de maneig d'errors personalitzada.

Exemple

function divide(a, b)
    if b == 0 then
        error("No es pot dividir per zero")
    else
        return a / b
    end
end

function errorHandler(err)
    return "Capturat un error: " .. err
end

local status, result = xpcall(divide, errorHandler, 10, 0)
if status then
    print("Resultat: " .. result)
else
    print(result)  -- Sortida: Capturat un error: No es pot dividir per zero
end

Exercicis Pràctics

Exercici 1: Captura d'Errors amb pcall

Escriu una funció que llegeixi un fitxer i capturi qualsevol error que pugui ocórrer durant la lectura.

function readFile(filename)
    local file, err = io.open(filename, "r")
    if not file then
        error("No es pot obrir el fitxer: " .. err)
    end
    local content = file:read("*a")
    file:close()
    return content
end

local status, content = pcall(readFile, "existent.txt")
if status then
    print("Contingut del fitxer:\n" .. content)
else
    print("Error: " .. content)
end

local status, content = pcall(readFile, "inexistent.txt")
if status then
    print("Contingut del fitxer:\n" .. content)
else
    print("Error: " .. content)  -- Sortida: Error: No es pot obrir el fitxer: ...
end

Exercici 2: Maneig d'Errors Personalitzat amb xpcall

Escriu una funció que divideixi dos nombres i utilitza xpcall per capturar errors amb una funció de maneig d'errors personalitzada.

function divide(a, b)
    if b == 0 then
        error("No es pot dividir per zero")
    else
        return a / b
    end
end

function customErrorHandler(err)
    return "Error capturat: " .. err
end

local status, result = xpcall(divide, customErrorHandler, 10, 0)
if status then
    print("Resultat: " .. result)
else
    print(result)  -- Sortida: Error capturat: No es pot dividir per zero
end

Resum

En aquesta secció, hem après com Lua maneja els errors i com podem utilitzar les funcions error, pcall i xpcall per gestionar errors de manera efectiva. La gestió d'errors és crucial per escriure codi robust i fiable, i aquestes tècniques ens ajuden a capturar i manejar situacions inesperades sense interrompre l'execució del programa.

En el següent tema, explorarem l'entrada i sortida de fitxers en Lua, una habilitat essencial per a moltes aplicacions pràctiques.

© Copyright 2024. Tots els drets reservats