perl carp

¿Cómo puedo reemplazar todos los ''morir'' con ''confesar'' en una aplicación Perl?



carp (4)

¿Qué hay de configurar un controlador de señal __DIE__ ? Algo como

$SIG{__DIE__} = sub { Carp::confess @_ };

en la parte superior de su guión? Ver perlvar% SIG para más información.

Estoy trabajando en una gran aplicación de Perl y me gustaría obtener seguimientos de pila cada vez que se llame ''die''. Soy consciente del módulo Carp , pero preferiría no buscar / reemplazar cada instancia de ''morir'' con ''confesar''. Además, me gustaría rastrear todos los errores de los módulos de Perl o el intérprete de Perl, y obviamente no puedo cambiarlos para usar Carp.

Entonces, ¿hay alguna manera de modificar la función ''morir'' en el tiempo de ejecución para que se comporte como ''confesar''? O, ¿hay una configuración de intérprete de Perl que arrojará rastros completos de pila de ''morir''?


El módulo de Error convertirá todas las die en objetos de Error::Simple , que contienen un seguimiento de pila completo (el constructor analiza el texto "en el archivo ... línea ..." y crea un seguimiento de pila). Puede usar un objeto arbitrario (generalmente subclasificado de Error::Simple ) para manejar los errores con la preferencia $Error::ObjectifyCallback .

Esto es especialmente útil si comúnmente desechas excepciones de otros tipos para señalar otros eventos, ya que solo agregas un controlador para Error::Simple (o cualquier otra clase que estés usando para errores) y le dices que descargue su stacktrace o que realice tareas especializadas. Registro en función del tipo de error.


Por lo general, solo quiero reemplazar los die en un poco de código, por lo que __DIE__ controlador __DIE__ :

{ use Carp; local $SIG{__DIE__} = /&Carp::confess; .... }

Como herramienta de desarrollo, esto puede funcionar, pero algunos módulos juegan trucos con esto para que sus características funcionen. Esas características pueden romperse de formas extrañas cuando reemplaza el controlador que estaban esperando. No es una buena práctica, pero sucede a veces.


Use Devel::SimpleTrace o Carp::Always y ellos harán lo que están pidiendo sin ningún esfuerzo por su parte. Tienen un efecto global, lo que significa que se pueden agregar fácilmente para una sola ejecución en la línea de comandos usando, por ejemplo, -MDevel::SimpleTrace .