Appels protégés avec pcall()
Fait partie de la section Logique et flux du Journey Lua de Coddy. Leçon 33 sur 54.
Alors que error() arrête votre programme lorsqu’un problème survient, vous pouvez parfois vouloir gérer les erreurs sans provoquer de plantage. La fonction pcall() de Lua vous permet d’exécuter en toute sécurité du code susceptible d’échouer.
Le nom pcall() signifie « appel protégé ». Il enveloppe un appel de fonction dans une couche de protection qui intercepte les erreurs. Au lieu que votre programme se termine 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 statut booléen : true si la fonction a réussi, ou false si une erreur s’est produite. La seconde valeur dépend du statut : en cas de réussite, il s’agit de la valeur renvoyée par la fonction ; en cas d’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 planter, pcall() l’intercepte. Le programme continue de s’exécuter et peut gérer l’erreur correctement en vérifiant la valeur d’état.
Défi
FacileÉcrivez une fonction safeCalculate qui accepte operation, a et b, et renvoie 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 d’opération, puis encapsulez-la avec pcall() pour détecter les erreurs.
Logique :
- Créez une fonction interne qui vérifie le type d’opération et effectue le calcul
- Pour "add", renvoyez
a + b - Pour "subtract", renvoyez
a - b - Pour "multiply", renvoyez
a * b - Pour "divide", vérifiez si
bvaut 0 et appelezerror("Division by zero", 0)si c’est le cas, sinon renvoyeza / b - Pour toute autre opération, appelez
error("Invalid operation", 0) - Utilisez
pcall()pour exécuter la fonction interne - En cas de réussite, renvoyez
"Result: "suivi du résultat - Si une erreur se produit, renvoyez
"Error: "suivi du message d’erreur
Passez 0 comme deuxième argument de error(). Cet argument correspond au niveau d’erreur, et 0 indique à Lua de ne pas placer le nom du fichier et le numéro de ligne devant votre message, de sorte que la chaîne renvoyée soit exactement "Error: Division by zero".
Paramètres :
operation(string) : L’opération à effectuer ("add", "subtract", "multiply", ou "divide")a(number) : Le premier opérandeb(number) : Le deuxième opérande
Valeur renvoyée : Une chaîne contenant soit "Result: " suivi du résultat du calcul, soit "Error: " suivi du message d’erreur (string)
Essayez vous-même
function safeCalculate(operation, a, b)
-- Écrivez le code ici
-- Note : appelez error(message, 0) pour que Lua n'ajoute pas le nom du fichier et le
-- numéro de ligne devant votre message.
endCette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et flux
1Itération avancée des tables
Itérer avec pairs()Itérer avec ipairs()pairs() contre ipairs()Récapitulatif - Fiche de personnage2Fonctions supplémentaires de la bibliothèque table
table.concat()construction de tables et unpack()table.sort()Tri personnalisé avec des fonctionsRécapitulatif - Tableau des meilleurs scores3Concepts avancés des fonctions
Retourner plusieurs valeursFonctions variadiques (...)Les fonctions comme valeurs de première classeFonctions anonymesQu’est-ce qu’une fermeture ?Récapitulatif - Gestionnaire d’événements simple6Gestion des erreurs
La fonction error()Appels protégés avec pcall()Récapitulatif - Division sécuriséeEntraînez-vous par vous-même : Compilateur Lua en ligne