die LISTA
Fuori da un eval, stampa il valore di LISTA su STDERR ed esce
dal programma con il valore corrente di $! (errno). Se $!
è 0, il codice di uscita è il valore di
($?> 8)> (stato del `comando` in backtick). Se
($?> 8)> è 0, esce con codice 255. All'interno
di un eval(), il messaggio di errore viene memorizzato in $@ e
il blocco eval viene terminato con undef come valore restituito.
Questo rende die il modo di implementare una eccezione.
Esempi equivalenti:
die "Impossibile cambiare directory in spool: $!\n" unless chdir '/usr/spool/news';
chdir '/usr/spool/news' or die "Impossibile cambiare directory in spool: $!\n"
Se l'ultimo elemento di LISTA non termina con un ritorno a capo, la
riga corrente dello script e la riga corrente dell'input (ove esistente)
vengono stampate con un ritorno a capo in fondo. Va notato che la
"riga corrente dell'input" (chiamata anche "chunk") è soggetto alla
nozione di "linea" correntemente utilizzata, ed è disponibile anche
nella variabile $.. Consultate perlvar/"$/" e perlvar/"$.".
Suggerimento: a volte, aggiungere ", stopped" [interrotto, NdT] al vostro
messaggio può avere senso quando viene aggiunta la stringa
"at pippo line 123". Supponiamo che stiate facendo girare lo script
"canasta".
die "/etc/games non va bene";
die "/etc/games non va bene, interrotto";
producono, rispettivamente
/etc/games non va bene at canasta line 123.
/etc/games non va bene, interrotto at canasta line 123.
Si veda anche exit(), warn(), e il modulo Carp.
Se LISTA è vuota e $@ già contiene un valore
(generalmente da un eval precedente), questo valore viene riutilizzato
con l'aggiunta di un "\t...propagated" [propagato, NdT]. Può
essere utile per propagare delle eccezioni:
eval { ... };
die unless $@ =~ /Expected exception/;
Se LISTA è vuota e $@ contiene un oggetto che ha un metodo
PROPAGATE, questo metodo sarà chiamato con il nome del file
e il numero di riga come parametri aggiuntivi. In questo caso, il
valore restituito rimpiazza il valore in $@, ossia come se fosse
stato chiamato <$@ = eval { $@-PROPAGATE(__FILE__, __LINE__) };>>.
Se $@ è vuoto, viene utilizzata la stringa "Died"
[terminato, NdT].
die() può anche essere chiamato con un argomento che sia un
riferimento. Se questo accade all'interno di un eval(), $@ contiene
quell'oggetto. Questo comportamento permette di implementare delle
eccezioni più sofisticate, utilizzando degli oggetti che
possono contenere dati relativi alla natura dell'eccezione. Questo
schema è a volte preferibile all'utilizzo di espressioni
regolari per verificare la presenza di particolari valori nella
stringa $@. Ecco un esempio:
use Scalar::Util 'blessed';
eval { ... ; die Unqualche::Modulo::Eccezione->new( PIPPO => "pluto" ) };
if ($@) {
if (blessed($@) && $@->isa("Unqualche::Modulo::Eccezione")) {
# gestisce Unqualche::Modulo::Eccezione
}
else {
# gestisce tutte le altre possibili eccezioni
}
}
Poiché perl converte in stringa i messaggi non gestiti prima
di visualizzarli, potreste implementare un overload dell'operatore di
conversione a stringa su tali oggetti eccezione. Consultate
overload per maggiori dettagli.
Potete fare in modo che venga chiamata una funzione appena prima che
die faccia il suo dovere, impostando un riferimento in $SIG{__DIE__}.
La funzione indicata sarà chiamata con il testo dell'errore e
può, volendo, modificare il messaggio d'errore chiamando
nuovamente die. Si veda perlvar/$SIG{expr} per dettagli sull'utilizzo di
%SIG, e "eval BLOCK" per qualche esempio. Nonostante questa funzionalità
dovesse essere eseguita solo immediatamente prima dell'uscita dal programma,
ma non è più così -- la funzione
in $SIG{__DIE__} viene chiamata anche all'interno di blocchi o
stringhe in eval()! Se si vuole che la funzione non faccia nulla in questi
casi, mettere un
die @_ if $^S;
come prima linea della funzione (si veda perlvar/$^S). Poiché
questo può causare effetti collaterali non desiderati, questo
comportamento non intuitivo potrebbe essere modificato in una versione
successiva.