perl error-handling carp

perl - ¿Cuál es la diferencia entre Carp/Croak, Cluck/Confess y las opciones detalladas?



error-handling (2)

No he usado Carp tanto porque en general he hecho mi propia versión. Sin embargo, en el espíritu de mantenerme con los módulos Core, lo estoy usando ahora. Sin embargo, parece que es apenas mejor que advertir / morir.

Además, ¿qué hace incluso cluck / confess / verbose? He ejecutado este pequeño script para tener una idea de cómo se ve el resultado (porque los documentos de Carp no lo hacen). Se ve exactamente igual en cualquier ejecución (además de las cadenas aleatorias).

#!/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();

ACTUALIZACIÓN: actualizó la secuencia de comandos con los nombres de los paquetes y hace la diferencia. Sin embargo, Carp todavía parece ser muy básico en términos de la información de registro, y no es compatible con la salida web. Creo que miraré otros como CGI :: Carp, Log :: Output y Log :: Log4Perl.


El problema con su ejemplo es que todos sus subs están en el mismo paquete (el paquete predeterminado: main ). Ese no es el caso de uso para el que fue diseñada Carp .

Carp está destinado a ser utilizado en módulos. La razón es que cuando un módulo encuentra un problema, a menudo se debe a que el llamante del módulo le pasó datos incorrectos. Por lo tanto, en lugar de informar la línea donde el módulo descubrió el problema, generalmente es más útil informar la línea a la que se llamó el módulo (desde el código fuera del módulo). Eso es lo que hacen las funciones exportadas por Carp.

Hay 2 conjuntos de opciones de sí / no. La función puede ser fatal (como die ) o no fatal (como warn ). Puede informar solo la línea donde se llamó a la función, o puede informar una traza inversa completa.

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

La opción verbosa fuerza backtraces en. Es decir, hace que la carp actúe como un cluck , y croak actúa como confess . Puede usar eso cuando se da cuenta de que necesita más información de depuración, pero no quiere cambiar el código para usar confess .


Carp es mejor que warn / die en que mostrará el archivo y la línea de lo que llamó la función que arroja un error, en lugar de simplemente donde se arrojó el error. Esto a menudo puede ser útil para las bibliotecas. (Por ejemplo, una biblioteca de base de datos probablemente arroje errores que indiquen dónde se encuentra la llamada errónea de la base de datos, en lugar de indicar una línea dentro de sí misma).

carp , cluck , croak y confess dan cuatro combinaciones de opciones:

  • carp : no es fatal, no hay retroceso
  • cluck : no es fatal, con backtrace
  • croak : fatal, sin retroceso
  • confess : fatal, con traza inversa