¿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?
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.
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.
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.
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.
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