2013-10-29 9 views
11

Perl implementa attualmente $SIG{__DIE__} in modo tale da rilevare eventuali errori che si verificano, anche all'interno di blocchi eval. Questo ha una proprietà veramente utile che è possibile arrestare il codice nel punto esatto in cui si verifica l'errore, raccogliere una traccia di stack dell'errore effettivo, avvolgerlo in un oggetto e quindi chiamare manualmente lo stesso con questo oggetto come parametro.Errori di runtime di cattura in Perl e conversione in eccezioni

Questo abuso di $SIG{__DIE__} è obsoleto. Ufficialmente, si suppone di sostituire $SIG{__DIE__} con *CORE::GLOBAL::die. Tuttavia, questi due sono NON equivalenti remotamente. *CORE::GLOBAL::die è NOT chiamato quando si verifica un errore di runtime! Tutto ciò che fa è sostituire le chiamate esplicite a die().

Non sono interessato a sostituire il dado.

Sono specificamente interessato a rilevare gli errori di runtime.

Ho bisogno di assicurarmi che qualsiasi errore di runtime, in qualsiasi funzione, a qualsiasi profondità, in qualsiasi modulo, fa sì che Perl mi passi il controllo in modo da poter raccogliere la traccia dello stack e il rethrow. Questo ha bisogno di lavorare all'interno di un blocco eval: uno o più blocchi eval che racchiudono possono prendere l'eccezione, ma l'errore di runtime potrebbe essere in una funzione senza un'eval di inclusione, all'interno di qualsiasi modulo, da nessuna parte.

$SIG{__DIE__} supporta perfettamente questo e mi ha servito fedelmente per un paio di anni o più, ma i Poteri che Be ™ avvertono che questa fantastica struttura può essere strappata via in qualsiasi momento, e non voglio una brutta sorpresa un giorno lungo la linea.

Idealmente, per il Perl stesso, potrebbero creare un nuovo segnale $SIG{__RTMERR__} per questo scopo (il segnale di commutazione è abbastanza facile, comunque per me, poiché è collegato solo in un punto). Sfortunatamente, i miei poteri persuasivi non avrebbero indotto un alcolista a aprire una bottiglia, quindi supponendo che ciò non accada, in che modo esattamente uno dovrebbe raggiungere questo scopo di rilevare gli errori di runtime in modo pulito?

(ad esempio, un'altra risposta qui raccomanda Carp :: Sempre che ... anche ganci DIE!)

risposta

3

Just do it. L'ho fatto. Probabilmente tutti quelli che sono a conoscenza di questo hook lo hanno fatto.

È Perl; è ancora compatibile per decenni. Interpreto "deprecato" qui per significare "per favore non usarlo se non ne hai bisogno, ew, lordo". Ma tu ne hai bisogno, e sembra comprenderne le implicazioni, quindi non farcela. Dubito seriamente che una funzione linguistica insostituibile stia andando via in qualunque momento presto.

E rilascia il tuo lavoro su CPAN in modo che il prossimo sviluppatore non debba reinventarlo di nuovo. :)

+0

E 'stato deprecato per anni, ma fino ad ora, nessuna sostituzione è stata dichiarata. Questo significa che non è deprecato, o che non intendono mantenere la funzionalità, o che semplicemente hanno trascurato di indicare l'approccio corretto. Non puoi deprecare qualcosa di importante se è l'unico modo per ottenere qualcosa! Forse non lo faranno ... –

+3

Secondo [una ricerca su grep.cpan.me] (http://grep.cpan.me/?q=__DIE__ [% 27% 22]% 3F \} + *% 3D) "più di 1000 distribuzioni" stanno usando '$ SIG {__ DIE __}'. Non penso che andrà mai ... –

Problemi correlati