Gestion des erreurs en Lua

Bonjour à tous, futurs programmeurs ! Aujourd'hui, nous allons plonger dans le monde de la gestion des erreurs en Lua. Ne vous inquiétez pas si vous n'avez jamais écrit une seule ligne de code auparavant - je vais vous guider pas à pas, comme j'ai fait pour des centaines d'étudiants au fil des ans. Alors, mettons-nous en route pour cette aventure passionnante ensemble !

Lua - Error Handling

Nécessité de la gestion des erreurs

Imaginez que vous faites un gâteau pour la première fois. Vous suivez la recette avec attention, mais soudain vous vous rendez compte que vous n'avez plus de sucre. Que faire ? Vous ne pouvez pas continuer à cuire sans cet ingrédient crucial, n'est-ce pas ? C'est là que la gestion des erreurs devient utile en programmation.

Dans le monde de la programmation, les erreurs sont comme des ingrédients manquants dans notre recette. Elles peuvent se produire pour diverses raisons :

  1. Entrées invalides des utilisateurs
  2. Problèmes de réseau
  3. Problèmes du système de fichiers
  4. Erreurs logiques dans notre code

Sans une gestion adéquate des erreurs, notre programme pourrait planter ou produire des résultats inattendus. C'est pourquoi il est crucial d'apprendre à gérer les erreurs avec grâce.

Les fonctions Assert et Error

La fonction Assert

Commençons par la fonction assert. Cette fonction est comme un gardien vigilant qui vérifie si une condition est vraie. Si ce n'est pas le cas, elle lève une erreur.

Voici un exemple simple :

local age = 15
assert(age >= 18, "Vous devez avoir 18 ans ou plus pour entrer !")
print("Bienvenue au club !")

Si vous exécutez ce code, vous verrez un message d'erreur :

lua: example.lua:2: Vous devez avoir 18 ans ou plus pour entrer !

La fonction assert a vérifié si age >= 18 était vrai. Puisque ce n'est pas le cas, elle a levé une erreur avec notre message personnalisé.

La fonction Error

Maintenant, découvrons la fonction error. Cette fonction nous permet de générer nos propres erreurs lorsque nous en avons besoin.

Voici un exemple :

local function divide(a, b)
if b == 0 then
error("Impossible de diviser par zéro !")
end
return a / b
end

print(divide(10, 2))  -- Cela fonctionnera bien
print(divide(10, 0))  -- Cela levera une erreur

Lorsque vous exécutez ce code, vous verrez :

5
lua: example.lua:3: Impossible de diviser par zéro !

La première instruction print fonctionne bien, mais la seconde déclenche notre erreur car nous tentons de diviser par zéro.

pcall et xpcall

Maintenant, apprenons à utiliser deux fonctions puissantes qui nous aident à gérer les erreurs : pcall et xpcall.

La fonction pcall

pcall signifie "appel protégé". Elle nous permet d'appeler une fonction en mode protégé, en attrapant toute erreur qui pourrait survenir.

Voici un exemple :

local function riskyFunction()
error("Oups ! Quelque chose s'est mal passé !")
end

local success, errorMessage = pcall(riskyFunction)

if success then
print("La fonction s'est exécutée avec succès !")
else
print("Une erreur s'est produite :", errorMessage)
end

Lorsque vous exécutez ce code, vous verrez :

Une erreur s'est produite : example.lua:2: Oups ! Quelque chose s'est mal passé !

pcall renvoie deux valeurs : un booléen indiquant le succès ou l'échec, et soit la valeur de retour de la fonction (si elle a réussi), soit un message d'erreur (si elle a échoué).

La fonction xpcall

xpcall est comme le frère plus sophistiqué de pcall. Il nous permet de fournir une fonction de gestion des erreurs personnalisée.

Voici un exemple :

local function errorHandler(err)
print("GESTIONNAIRE D'ERREUR PERSONNALISÉ :")
print(debug.traceback("Erreur : " .. tostring(err), 2))
return "Erreur gérée !"
end

local function riskyFunction()
error("Danger, Will Robinson !")
end

local success, result = xpcall(riskyFunction, errorHandler)

if success then
print("La fonction s'est exécutée avec succès !")
else
print("Une erreur s'est produite. Résultat :", result)
end

Lorsque vous exécutez ce code, vous verrez un trace détaillé de l'erreur :

GESTIONNAIRE D'ERREUR PERSONNALISÉ :
Erreur : Danger, Will Robinson !
stack traceback:
example.lua:7: in function 'riskyFunction'
[C]: in function 'xpcall'
example.lua:11: in main chunk
[C]: in ?
Une erreur s'est produite. Résultat : Erreur gérée !

Cela nous donne beaucoup plus d'informations sur l'endroit et la raison de l'erreur.

Méthodes de gestion des erreurs

Voici un tableau résumant les méthodes de gestion des erreurs que nous avons apprises :

Méthode Description Cas d'utilisation
assert Vérifie une condition et lève une erreur si elle est fausse Validation des entrées
error Lève une erreur personnalisée Lorsqu'une condition d'erreur spécifique est remplie
pcall Appelle une fonction en mode protégé Lorsque vous souhaitez attraper et gérer des erreurs
xpcall Appelle une fonction en mode protégé avec un gestionnaire d'erreur personnalisé Lorsque vous avez besoin d'informations détaillées sur l'erreur

Souvenez-vous, une bonne gestion des erreurs est comme porter une ceinture de sécurité en conduisant. Cela peut sembler inutile lorsque tout se passe bien, mais cela peut vous sauver de bien des ennuis lorsque les choses se compliquent !

Pratiquez ces concepts, expérimentez avec différents scénarios, et bientôt vous serez capable de gérer les erreurs comme un pro. Bon codage, et n'oubliez pas d'embrasser vos erreurs - elles sont juste des occasions d'apprendre et d'améliorer votre code !

Credits: Image by storyset