perl module carp

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