60 votes

Quelle est la différence entre les options Carp / Croak, Cluck / Confess et verbose?

Je n'ai pas utilisé la Carpe car j'ai généralement roulé ma propre. Cependant, dans l'esprit de garder avec des modules de Base, je l'utilise maintenant. Cependant, il semble que c'est à peine mieux que de mettre en garde/die.

En outre, ce qui fait cot-cot-codec/avouer/verbose même le faire? J'ai couru ce petit script pour avoir une idée de la sortie ressemble (parce que la Carpe docs ne pas le faire). Il est exactement le même sur n'importe quelle course (en plus de l'aléatoire de chaînes de caractères).

  #!/usr/bin/perl

  package Warning;

  sub warning {
    warn "warn";
  }

  package CWarn;
  use Carp qw(carp cluck);

  sub cwarn {
    int(rand(2)) ? carp "carp" : cluck "cluck";
  }

  package Fatal;
  use Carp qw(confess croak);

  sub fatal {
    int(rand(2)) ? confess "confess" : croak "croak";
  }

  package Loop;

  use v5.10;

  sub loop {
    say '=' x 80;
    Warning::warning();
    CWarn::cwarn();
    loop() unless ($c++ > 10);
    Fatal::fatal();
  }

  package main;

  Warning::warning();
  CWarn::cwarn();
  Loop::loop();

Mise à JOUR: mise à Jour le script avec les noms de paquets et cela fait une différence. Cependant, la Carpe semble encore très basique en termes de connexion de l'information, et il ne supporte pas de sortie web. Je crois que je vais regarder les autres comme CGI::Carp, Log::Sortie, et Log::Log4Perl.

153voto

cjm Points 44090

Le problème avec votre exemple, c'est que tous nos sous-marins sont dans le même package (le package par défaut: main). Ce n'est pas le cas d'utilisation que la Carpe a été conçu pour.

La carpe est destiné à être utilisé dans les modules. La raison en est que, lorsqu'un module rencontre un problème, c'est souvent parce que le module de l'appelant transmis les données de mauvaise qualité. Par conséquent, au lieu de l'enregistrement de la ligne où le module découvert le problème, il est souvent plus utile de rendre compte de la ligne où le module a été appelé (code de l'extérieur du module). C'est ce que les fonctions exportées par la Carpe n'.

Il y a 2 jeux de oui/non options. La fonction peut être fatale (comme die) ou non mortels (comme warn). Il peut rapport sur l'état de la ligne où la fonction a été appelée, ou il peut signaler un backtrace complet.

         Fatal  Backtrace
carp       N        N
cluck      N        Y
croak      Y        N
confess    Y        Y

L'option verbose forces backtraces sur. Qui est, il ne fait carp agir comme cluck, et croak agir comme confess. Vous pouvez l'utiliser quand vous vous rendez compte que vous avez besoin de plus d'informations de débogage, mais ne veulent pas de modifier le code pour utiliser confess.

26voto

duskwuff Points 69245

Carp est mieux que warn/die en ce qu'il affiche le fichier et la ligne de ce qui s'appelle la fonction de lancer une erreur, plutôt que de simplement l'endroit où l'erreur a été levée. Cela peut souvent être utile pour les bibliothèques. (Par exemple, une base de données de la bibliothèque devrait probablement jeter des erreurs indiquant l'emplacement de l'erreur de la base de données est, plutôt que d'indiquer une ligne à l'intérieur de lui-même.)

carp, cluck, croak, et confess vous donner quatre combinaisons d'options:

  • carp: pas fatale, pas de trace
  • cluck: pas fatale, avec backtrace
  • croak: fatal, pas de trace
  • confess: fatal, avec backtrace

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X