2011-11-08 13 views
19

Voglio verificare la presenza di errori in un particolare file di sfondo, ma il flusso di errore standard è controllato dal programma in primo piano e gli errori nel file nella domanda non sono essere visualizzato. Posso usare il modulo logging e scrivere l'output in un file, comunque. Mi stavo chiedendo come posso usare questo per registrare tutte le eccezioni, gli errori e le loro traceback.Utilizzo del modulo di registrazione di Python per registrare tutte le eccezioni e gli errori

+0

Eventuali duplicati di [Logging non gestite fanno eccezioni in Python] (http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python) –

risposta

40

Probabilmente è una cattiva idea registrare qualsiasi eccezione generata all'interno del programma, poiché Python utilizza eccezioni anche per il normale flusso di controllo.

Pertanto è necessario registrare solo eccezioni non nascoste. Puoi farlo facilmente usando il logger exception() method, una volta che hai un oggetto di eccezione.

per gestire tutte le eccezioni non gestite fanno, è possibile avvolgere punto di ingresso del vostro scritto in un blocco try...except, o installando un gestore di eccezioni personalizzato da ri-assegnazione sys.excepthook():

import logging 
import sys 

logger = logging.getLogger('mylogger') 
# Configure logger to write to a file... 

def my_handler(type, value, tb): 
    logger.exception("Uncaught exception: {0}".format(str(value))) 

# Install exception handler 
sys.excepthook = my_handler 

# Run your main script here: 
if __name__ == '__main__': 
    main() 
+0

Grazie! Questo è esattamente ciò di cui avevo bisogno. –

+0

Non è una buona idea aggiungere "sys .__ excepthook __ (type, value, tb)' al proprio 'my_handler', in modo che possa elaborare le azioni predefinite sull'eccezione? – troyane

+2

@Ferdinand Beyer: Neat. Avendo 'logger.exception (" Eccezione non rilevata: {0}: {1} ". Format (str (valore .__ classe __.__ nome__), str (valore))) dà nel mio caso' ERRORE - Eccezione non rilevata: IndexError: elenco index out of range' e stampa per qualche motivo 'None'. Come ottengo anche il traceback completo? 'tb' sembra essere un oggetto traceback ma' traceback.print_tb (tb) 'sputa anche' None'. – bioslime

Problemi correlati