Menu
Coddy logo textTech

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 souhaitez parfois 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 toutes les erreurs. Au lieu que votre programme plante, 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)
end

Dans 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.

challenge icon

Défi

Facile
Écrivez une fonction safeCalculate qui prend operation, a et b et renvoie le résultat du calcul ou un message d’erreur.

La fonction doit utiliser pcall() pour effectuer de manière sécurisée 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 intercepter 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 b vaut 0 et appelez error("Division by zero") si c’est le cas ; sinon, renvoyez a / b
  • Pour toute autre opération, appelez error("Invalid operation")
  • 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

Paramètres :

  • operation (chaîne) : l’opération à effectuer ("add", "subtract", "multiply" ou "divide")
  • a (nombre) : le premier opérande
  • b (nombre) : le second opérande

Valeur renvoyée : une chaîne contenant soit "Result: " suivi du résultat du calcul, soit "Error: " suivi du message d’erreur (chaîne)

Essayez vous-même

function safeCalculate(operation, a, b)
    -- Écrivez le code ici
    -- Note : Le test runner s'attend à ce que le message d'erreur inclue le numéro de ligne.
    -- Assurez-vous que votre appel d'erreur est sur la ligne attendue ou utilisez un message d'erreur simple si le test runner le permet.
end
quiz iconTestez-vous

Cette 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

Entraînez-vous par vous-même : Compilateur Lua en ligne