2011-10-26 9 views
5

Ho un modulo che deve eseguire un controllo in un blocco BEGIN. Ciò impedisce all'utente di vedere un messaggio inutile lungo la linea (durante la fase di compilazione, visto qui in secondo BEGIN).Sopprime "BEGIN failed - compilation aborted at"

Il problema è che se muoio dentro l'INIZIO il messaggio che lancio viene sepolto dietro BEGIN failed--compilation aborted at. Tuttavia preferisco lo die allo exit 1 poiché sarebbe quindi intercettabile. Dovrei semplicemente usare exit 1 o c'è qualcosa che posso fare per sopprimere questo messaggio aggiuntivo?

#!/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."; 
} 

risposta

10

Quando si die si sta gettando un'eccezione che viene catturato ad un livello precedente chiamata. L'unico gestore che catturerà lo die dal tuo blocco BEGIN è il compilatore e che sta automaticamente allegando la stringa di errore che non vuoi.

Per evitare questo, è possibile utilizzare la soluzione exit 1 hai trovato, oppure è possibile installare un nuovo gestore dado:

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

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

Grazie! Ora tutto quello che ottengo è: 'Alcuni moduli necessari mancano o devono essere aggiornati prima di configurare Alien :: GSL. Quei moduli sono: \t Sort :: Versions' –

+0

Dovrei dire, che è quello che volevo! –