Section courante

A propos

Section administrative du site

Carp

À la carpe
Perl
 

Ce module permet de générer des messages d'erreurs. Il s'agit d'un modules d'alternatives pour les avertissements et les extinctions.

Synopsis

  1. use Carp;
  2.  
  3. # avertir l'utilisateur (du point de vue de l'appelant)
  4. carp "chaîne réduite à 80 caractères";
  5.  
  6. # mourir d'erreurs (du point de vue de l'appelant)
  7. croak "On s'en va !";
  8.  
  9. # mourir d'erreurs avec la pile de traces
  10. confess "non implémenté";
  11.  
  12. # cluck, longmess et shortmess ne sont pas exportés par défaut
  13. use Carp qw(cluck longmess shortmess);
  14. cluck "C'est ainsi que nous en sommes arrivés là !"; # avertir avec la trace de la pile
  15. my $long_message   = longmess( "message de cluck() ou confess()" );
  16. my $short_message  = shortmess( "message de carp() ou croak()" );

Description

Les routines Carp sont utiles dans vos propres modules car elles agissent comme die() ou warn(), mais avec un message plus susceptible d'être utile à un utilisateur de votre module. Dans le cas de cluck() et confess(), ce contexte est un résumé de chaque appel dans la pile d'appels; longmess() renvoie le contenu du message d'erreur.

Pour un message plus court, vous pouvez utiliser carp() ou croak() signalant l'erreur comme provenant de l'endroit où votre module a été appelé. shortmess() renvoie le contenu de ce message d'erreur. Il n'y a aucune garantie que l'erreur provienne de cet endroit, mais c'est une estimation raisonnable.

Carp prend soin de ne pas altérer les variables d'état $! et $^E lors de l'assemblage de ses messages d'erreur. Cela signifie qu'un gestionnaire $SIG{__DIE__} ou $SIG{__WARN__} peut capturer les informations d'erreur contenues dans ces variables, si cela est nécessaire pour compléter le message d'erreur, et si le code appelant Carp y a laissé des valeurs utiles. Bien entendu, Carp ne peut garantir ce dernier point.

Vous pouvez également modifier le fonctionnement de la sortie et de la logique de Carp en modifiant certaines variables globales de l'espace de noms Carp. Consultez la section «VARIABLES GLOBALES» ci-dessous.

Voici une description plus complète du fonctionnement de Carp et Croak. Ils recherchent dans la pile d'appels une pile d'appels de fonction où aucune erreur ne devrait se produire. Si chaque appel est marqué comme sûr, ils abandonnent et fournissent une trace de pile complète. Autrement dit, ils supposent que le premier suspect potentiel leur semblant probable est coupable. Leurs règles pour déterminer si un appel ne devrait pas générer d'erreurs fonctionnent comme suit :

Forcer une trace de pile

Pour faciliter le débogage, vous pouvez forcer Carp à traiter un croassement comme une confession et un cri comme un gloussement dans tous les modules. Autrement dit, forcer la génération d'une trace de pile détaillée. Cela peut s'avérer très utile pour comprendre pourquoi, ou d'où, un avertissement ou une erreur est généré.

Cette fonctionnalité est activée en important le symbole inexistant «verbose». Vous l'activez généralement en disant :

perl -MCarp=verbose script.pl

ou en incluant la chaîne -MCarp=verbose dans la variable d'environnement PERL5OPT.

Vous pouvez également définir la variable globale $Carp::Verbose sur true. Consultez la section «VARIABLES GLOBALES» ci-dessous.

Formatage de la trace de pile

À chaque niveau de la pile, le nom de la sous-routine est affiché avec ses paramètres. Pour les scalaires simples, cela suffit. Pour les types de données complexes, tels que les objets et autres références, il suffit d'afficher «HASH(0x1ab36d8)».

Carp propose deux méthodes pour contrôler cela.

Pour les objets, une méthode, CARP_TRACE, est appelée si elle existe. Si cette méthode n'existe pas, ou si elle effectue une récursion dans Carp, ou si elle génère une exception, cette opération est ignorée et Carp passe à l'option suivante. Sinon, la vérification s'arrête et la chaîne renvoyée est utilisée. Il est recommandé que le type de l'objet fasse partie de la chaîne pour faciliter le débogage.

Pour tout type de référence, $Carp::RefArgFormatter est vérifié (voir ci-dessous). Cette variable est censée être une référence de code, et le paramètre actuel est transmis. Si cette fonction n'existe pas (la variable est indéfinie), si elle effectue une récursion dans Carp ou si elle génère une exception, cette opération est ignorée et Carp passe à l'option suivante. Sinon, la vérification s'arrête et la chaîne renvoyée est utilisée.

Sinon, si ni CARP_TRACE ni $Carp::RefArgFormatter ne sont disponibles, convertissez la valeur en chaîne en ignorant toute surcharge.

VARIABLES GLOBALES

$Carp::MaxEvalLen

Cette variable détermine le nombre de caractères d'une chaîne d'évaluation à afficher dans la sortie. Utilisez la valeur 0 pour afficher tout le texte.

La valeur par défaut est 0.

$Carp::MaxArgLen

Cette variable détermine le nombre de caractères à afficher pour chaque argument d'une fonction. Utilisez la valeur 0 pour afficher la longueur totale du paramètre.

La valeur par défaut est 64.

$Carp::MaxArgNums

Cette variable détermine le nombre d'arguments à afficher pour chaque fonction. Utilisez la valeur «false» pour afficher tous les paramètres d'un appel de fonction. Pour supprimer tous les arguments, utilisez -1 ou « 0 mais vrai ».

La valeur par défaut est 8.

$Carp::Verbose

Cette variable permet à carp() et croak() de générer des traces de pile, tout comme cluck() et confess(). C'est ainsi que l'utilisation de Carp 'verbose' est implémentée en interne.

La valeur par défaut est 0.

$Carp::RefArgFormatter

Cette variable définit un formateur d'arguments général pour afficher les références. Les scalaires simples et les objets implémentant CARP_TRACE ne seront pas traités par ce formateur. L'appel de Carp depuis cette fonction n'est pas pris en charge.

  1. local $Carp::RefArgFormatter = sub {
  2.     require Data::Dumper;
  3.     Data::Dumper->Dump($_[0]); # pas nécessairement sûr
  4. };

@CARP_NOT

Cette variable, dans votre paquet, indique quels paquets ne doivent pas être considérés comme l'emplacement d'une erreur. Les fonctions carp() et cluck() ignoreront les appelants lorsqu'elles signaleront l'emplacement d'une erreur.

Remarque : Cette variable doit figurer dans la table des symboles du paquet, donc :

  1. # Ces travaux
  2. our @CARP_NOT; # portée du fichier
  3. use vars qw(@CARP_NOT); # portée du paquet
  4. @My::Package::CARP_NOT = ... ; # variable de paquet explicite
  5.  
  6. # Ceux-ci ne fonctionnent pas
  7. sub xyz { ... @CARP_NOT = ... } # sans déclarations ci-dessus
  8. my @CARP_NOT; # même au plus haut niveau

Exemple d'utilisation :

  1. package My::Carping::Package;
  2. use Carp;
  3. our @CARP_NOT;
  4. sub bar     { .... or _error('Mauvaise saisie') }
  5. sub _error  {
  6.     # contrôle temporaire de l'emplacement, __PACKAGE__ est implicite
  7.     local @CARP_NOT = qw(My::Friendly::Caller);
  8.     carp(@_)
  9. }

Cela obligerait Carp à signaler l'erreur comme provenant d'un appelant ne figurant pas dans My::Carping::Package, ni dans My::Friendly::Caller.

Consultez également la section «DESCRIPTION» ci-dessus pour savoir comment Carp détermine l'origine du signalement de l'erreur.

Utilisez @CARP_NOT au lieu de $Carp::CarpLevel.

Remplace l'utilisation de @ISA par Carp.

%Carp::Internal

Ceci indique les paquets internes à Perl. Carp ne signalera jamais une erreur provenant d'une ligne d'un paquet interne à Perl. Par exemple :

  1. $Carp::Internal{ (__PACKAGE__) }++;
  2. # le temps passe...
  3. sub foo { ... or confess("peu importe") };

fournirait une trace de pile complète, à partir du premier appelant hors de __PACKAGE__. (À moins que ce paquet ne soit également interne à Perl.)

%Carp::CarpInternal

Ceci indique les paquets internes au système d'avertissement de Perl. Pour générer une trace de pile complète, c'est la même chose que pour une trace interne à Perl : la trace de pile ne démarre pas dans les paquets listés dans %Carp::CarpInternal. Cependant, la situation est légèrement différente pour le message de résumé généré par carp ou croak. Ces erreurs ne sont pas signalées sur les lignes appelant des paquets dans %Carp::CarpInternal.

Par exemple, Carp lui-même est listé dans %Carp::CarpInternal. Par conséquent, la trace de pile complète de confess ne démarre pas dans Carp, et le message court appelant croak n'est pas placé sur la ligne où croak a été appelé.

$Carp::CarpLevel

Cette variable détermine le nombre de trames d'appel supplémentaires à ignorer, qui ne le seraient pas autrement, lors du signalement d'une erreur lors d'un appel à une fonction Carp. Il est relativement facile de compter ces trames d'appel pour les appels générant une trace de pile complète. En revanche, il est beaucoup plus difficile de le faire pour les appels générant un message court. En général, les utilisateurs ignorent trop de trames d'appel. Avec un peu de chance, ils en ignorent suffisamment pour que Carp parcoure toute la pile d'appels, détecte un problème et génère une trace de pile complète. Dans le cas contraire, l'erreur est signalée depuis un emplacement très haut dans la pile d'appels, ce qui peut induire en erreur.

Il est donc préférable d'éviter $Carp::CarpLevel. Utilisez plutôt @CARP_NOT, %Carp::Internal et %Carp::CarpInternal.

La valeur par défaut est 0.

Les bogues

Les routines Carp ne gèrent actuellement pas les objets d'exception. Si elles sont appelées avec un premier paramètre étant une référence, elles appellent simplement die() ou warn(), selon le cas.

Voir également

Carp::Always, Carp::Clan.



Dernière mise à jour : Vendredi, le 27 juin 2025