¿Por qué debería usar Carpas en lugar de advertir en Perl?


La gente sigue dándome ejemplos con carpas en lugar de advertir. ¿Por qué? ¿Qué hace que la carpa sea mejor que advertir?

Author: Frew Schmidt, 2008-10-09

4 answers

Carp te da más información sobre de dónde viene el mensaje (contexto)

#!/usr/bin/perl

use Carp;

foo();
bar();
baz();

sub foo {
  warn "foo";
}

sub bar {
  carp "bar";
}

sub baz {
  foo();
  bar(); 
}

Produce

foo at ./foo.pl line 9.
bar at ./foo.pl line 13
        main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
        main::bar() called at ./foo.pl line 19
        main::baz() called at ./foo.pl line 7

Un poco tonto para este pequeño programa, pero es útil cuando quieres saber quién llamó al método que es carp'ing.

 42
Author: derby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-07 18:44:57

Utilizo warn para scripts y programas simples, y Carp dentro de cualquier módulo. Las subrutinas Carp usan el nombre del archivo y el número de línea donde se llamó su subrutina actual, por lo que es más fácil encontrar quién está causando el problema (no solo dónde se manifestó el problema).

Damian recomienda Carp en lugar de warn en "Reporting Failure" en Las mejores prácticas de Perl, pero no hace la distinción entre scripts como construcciones de código de nivel superior y módulos como componentes que uso de programas.

Últimamente no me ha importado mucho porque he estado usando Log::Log4perl para manejar todo eso.

 22
Author: brian d foy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 19:44:01

Carp funciona mejor para depurar dentro de los módulos. Si solo está escribiendo un guion simple, no hay beneficio. De la documentación de la carpa :

Las rutinas Carp son útiles en sus propios módulos porque actúan como die() o warn(), pero con un mensaje que es más probable que sea útil para un usuario de su módulo. En el caso de cluck, confess y longmess ese contexto es un resumen de cada llamada en la pila de llamadas. Para un mensaje más corto puede utilizar carpa o croar que reportan el error como desde donde se llamó a su módulo. No hay garantía de que ahí es donde estaba el error, pero es una suposición bien educada.

 12
Author: jvasak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 19:44:46

Carp informa de errores desde la perspectiva de la persona que llama. Esto es útil para módulos en los que normalmente desea advertir sobre el uso incorrecto (por ejemplo, un argumento faltante) e identificar el lugar donde se produjo el error en lugar de donde se detectó . Esto es especialmente importante para las funciones de utilidad que se pueden usar en muchos lugares.

La mayoría de los autores usan warn en scripts y carp en módulos. Ocasionalmente uso warn dentro de un módulo cuando quiero el mensaje de error para reflejar un problema en la implementación del módulo (por ejemplo, un caso que debería soportar pero no lo hace) Es discutible que cluck sería mejor en tales situaciones, ya que proporciona una traza de fondo de pila completa.

 8
Author: Michael Carman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-10-09 19:51:56