¿Por qué debería usar Carp en lugar de advertir en Perl?
module (4)
Uso warn
para scripts y programas simples, y Carp
dentro de cualquier módulo. Las subrutinas de Carp
usan el nombre de 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
lugar de warn
en "Incumplimiento de informes" en Perl Best Practices , pero no establece la distinción entre scripts como construcciones de código de nivel superior y módulos como componentes que usan los programas.
En general, no me ha importado últimamente porque he estado usando Log::Log4perl para manejar todo eso.
La gente sigue dándome ejemplos con carpa en lugar de advertir. ¿Por qué? ¿Qué hace que la carpa sea mejor que advertir?
carp funciona mejor para la depuración dentro de los módulos. Si solo está escribiendo un guión simple, no hay beneficio. De la documentacion de Carp :
Las rutinas de 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 croak que informan que el error proviene del lugar al que se llamó su módulo. No hay garantía de que sea allí donde estuvo el error, pero es una buena suposición educada.
carpa 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 está carpando.
Carp
informa errores desde la perspectiva de la persona que llama. Esto es útil para los módulos donde normalmente desea advertir sobre el uso incorrecto (por ejemplo, un argumento faltante) e identificar el lugar donde ocurrió el error en lugar de dónde se detectó. Esto es especialmente importante para las funciones de utilidad que pueden usarse en muchos lugares.
La mayoría de los autores utilizan warn
en scripts y carp
en los módulos. Ocasionalmente uso warn
dentro de un módulo cuando quiero que el mensaje de error refleje un problema en la implementación del módulo (por ejemplo, un caso que debería ser compatible pero no lo es). Es discutible que el cluck
sea mejor en tales situaciones ya que proporciona un apilar detrás de la pista.