Appels protégés avec pcall()
Fait partie de la section Logic & Flow du Journey Lua de Coddy — leçon 33 sur 54.
Alors que error() arrête votre programme quand quelque chose ne va pas, vous souhaitez parfois gérer les erreurs sans planter. La fonction pcall() de Lua vous permet d'exécuter en toute sécurité du code qui pourrait échouer.
Le nom pcall() signifie « protected call » (appel protégé). Il enveloppe un appel de fonction dans une couche protectrice qui capture toutes les erreurs. Au lieu que votre programme ne s'arrête brutalement, pcall() renvoie des informations sur ce qui s'est passé.
Voici la syntaxe de base :
local status, result = pcall(functionName, arg1, arg2)La fonction pcall() renvoie deux valeurs. La première est un état booléen : true si la fonction a réussi, ou false si une erreur s'est produite. La seconde valeur dépend de l'état — en cas de succès, il s'agit de la valeur de retour de la fonction ; s'il y a eu une erreur, il s'agit du message d'erreur.
Voici un exemple pratique :
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)
endDans cet exemple, la division par zéro déclenche une erreur, mais au lieu de s'interrompre brutalement, pcall() l'intercepte. Le programme continue de s'exécuter et peut gérer l'erreur de manière élégante en vérifiant la valeur de statut.
Défi
FacileÉcrivez une fonction safeCalculate qui prend operation, a et b et retourne le résultat du calcul ou un message d'erreur.
La fonction doit utiliser pcall() pour effectuer en toute sécurité l'opération mathématique demandée. Créez une fonction interne qui effectue le calcul en fonction de la chaîne de caractères de l'opération, puis enveloppez-la avec pcall() pour intercepter les erreurs éventuelles.
Logique :
- Créez une fonction interne qui vérifie le type d'opération et effectue le calcul
- Pour "add", retournez
a + b - Pour "subtract", retournez
a - b - Pour "multiply", retournez
a * b - Pour "divide", vérifiez si
best 0 et appelezerror("Division by zero")si c'est le cas, sinon retourneza / b - Pour toute autre opération, appelez
error("Invalid operation") - Utilisez
pcall()pour exécuter la fonction interne - En cas de succès, retournez
"Result: "suivi du résultat - Si une erreur survient, retournez
"Error: "suivi du message d'erreur
Paramètres :
operation(string) : L'opération à effectuer ("add", "subtract", "multiply" ou "divide")a(number) : Le premier opérandeb(number) : Le second opérande
Retourne : Une chaîne de caractères contenant soit "Result: " suivi du résultat du calcul, soit "Error: " suivi du message d'erreur (string)
Aide-mémoire
La fonction pcall() (protected call) vous permet d'exécuter en toute sécurité du code susceptible d'échouer sans faire planter votre programme.
Syntaxe de base :
local status, result = pcall(functionName, arg1, arg2)pcall() retourne deux valeurs :
- status :
truesi la fonction a réussi,falsesi une erreur est survenue - result : La valeur de retour de la fonction en cas de succès, ou le message d'erreur si une erreur est survenue
Exemple :
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)
endCela permet d'intercepter l'erreur au lieu de faire planter le programme, ce qui lui permet de continuer et de gérer l'erreur de manière fluide.
Essayez vous-même
function safeCalculate(operation, a, b)
-- Écrire le code ici
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logic & Flow
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() vs. ipairs()Récapitulatif - Fiche de personnage2Plus de fonctions de la bibliothèque table
table.concat()Construction de table & unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des scores3Concepts avancés sur les fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu'est-ce qu'une closure ?Récapitulatif - Gestionnaire d'événements simple6Gestion des erreurs
La fonction error()Appels protégés avec pcall()Récapitulatif - Division sécurisée