En Perl, la gestion des erreurs est traditionnellement réalisée à l'aide des fonctions die, warn et du bloc eval. Pour une terminaison correcte du programme, il est recommandé d'utiliser die pour les erreurs critiques et warn pour les avertissements. Une autre méthode consiste à utiliser l'opérateur de bloc eval pour intercepter les erreurs fatales et les traiter ultérieurement.
Exemple :
open my $fh, '<', 'file.txt' or die "Can't open file: $! "; printf $fh "Hello" or warn "Couldn't write: $! "; # Gestion des erreurs avec eval my $result = eval { risky_function(); 1; }; unless ($result) { print "Error detected: $@ "; }
Il existe également des modules comme Try::Tiny et Error qui implémentent try/catch pour Perl.
Quelle est la différence entre l'utilisation de eval {} et une chaîne de caractères eval "...", et quels sont les pièges de chacune des méthodes ?
Beaucoup pensent à tort qu'ils sont identiques.
eval { ... }fonctionne comme un bloc try/catch, tandis queeval "..."compile et exécute la chaîne comme du code Perl à l'exécution. Lors de l'utilisation d'une chaîne, il est facile de faire une erreur et de potentiellement exposer le code à des injections SQL ou à des bugs de compilation.
Exemple des différences :
# Compile et exécute la chaîne comme du code Perl my $var = 'my $x = 2 + 2'; eval $var; # eval DIRTY! # Variante bloquée sécurisée my $error = eval { die "fail"; }; print $@ if $@;
Histoire
Dans un projet, les développeurs utilisaient eval "code" pour créer dynamiquement des commandes, ce qui a conduit à des erreurs de syntaxe inaccessibles au moment de l'exécution et à des problèmes de débogage.
Histoire
Gestion incorrecte des erreurs : les exceptions levées à l'intérieur de eval utilisant des variables locales n'ont pas été traitées, car $@ était écrasé par l'appel ultérieur de la fonction log.
Histoire
Dans un ancien code, au lieu d'utiliser try/catch, on n'utilisait que die(), ce qui entraînait une terminaison incontrolée du processus Perl et une perte de données dans les transactions de base de données.