2011-10-26 16 views
5

Tengo un módulo que necesita verificar en un bloque BEGIN. Esto evita que el usuario vea un mensaje inútil en la línea (durante la fase de compilación, visto en el segundo BEGIN aquí).Suprimir "BEGIN failed - compilation aborted at"

El problema es que si muero dentro del BEGIN, el mensaje que arrojo queda enterrado detrás de BEGIN failed--compilation aborted at. Sin embargo, prefiero die a exit 1, ya que sería interceptable. ¿Debería usar exit 1 o hay algo que pueda hacer para suprimir este mensaje adicional?

#!/usr/bin/env perl 

use strict; 
use warnings; 

BEGIN { 
    my $message = "Useful message, helping the user prevent Horrible Death"; 
    if ($ENV{AUTOMATED_TESTING}) { 
    # prevent CPANtesters from filling my mailbox 
    print $message; 
    exit 0; 
    } else { 

    ## appends: BEGIN failed--compilation aborted at 
    ## which obscures the useful message 
    die $message; 

    ## this mechanism means that the error is not trappable 
    #print $message; 
    #exit 1; 

    } 
} 

BEGIN { 
    die "Horrible Death with useless message."; 
} 

Respuesta

10

Cuando die usted está lanzando una excepción que se ve atrapado en un nivel llamada anterior. El único controlador que detectará el die desde su bloque BEGIN es el compilador, y eso asocia automáticamente la cadena de error que no desea.

Para evitar esto, puede utilizar la solución exit 1 que encontraste, o puede instalar un nuevo controlador de morir:

# place this at the top of the BEGIN block before you try to die 

local $SIG{__DIE__} = sub {warn @_; exit 1}; 
+0

Gracias! Ahora todo lo que obtengo es: 'Faltan algunos módulos necesarios o se deben actualizar antes de configurar Alien :: GSL. Esos módulos son: \t Sort :: Versions' –

+0

Debo decir, ¡que es lo que quería! –