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
- Errors en Lua: Lua utilitza una funció anomenada
error
per generar errors. - Funció
pcall
: La funciópcall
(protected call) s'utilitza per capturar errors sense interrompre l'execució del programa. - Funció
xpcall
: Similar apcall
, però permet especificar una funció de maneig d'errors personalitzada. - 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.
Curs de Programació en Lua
Mòdul 1: Introducció a Lua
Mòdul 2: Conceptes Bàsics
Mòdul 3: Conceptes Intermedis
Mòdul 4: Conceptes Avançats
- Coroutines
- Programació Orientada a Objectes en Lua
- Tècniques de Depuració
- Optimització del Rendiment
- Ús de l'API C de Lua
Mòdul 5: Aplicacions Pràctiques
- Construcció d'un Joc Simple
- Scripting en Motors de Joc
- Automatització de Tasques amb Lua
- Integració de Lua amb Altres Llenguatges