Domanda

Ho installato il modulo di registrazione per il mio nuovo script python. Ho due gestori, un invio di roba in un file, e uno per gli avvisi e-mail. Lo SMTPHandler è configurato per posta qualcosa al livello di errore o superiore.

Tutto funziona alla grande, a meno che la connessione SMTP non riesce. Se il server SMTP non risponde o l'autenticazione non riesce (richiede autenticazione SMTP), quindi l'intero script muore.

Sono abbastanza nuovo per python, quindi sto cercando di capire come catturare l'eccezione che lo SMTPHandler sta sollevando in modo che eventuali problemi durante l'invio del messaggio di log via e-mail non saranno abbattere tutta la mia sceneggiatura. Dal momento che sto scrivendo anche gli errori in un file di log, se l'avviso SMTP non riesce, voglio solo andare avanti, non fermare nulla.

Se ho bisogno di un "provare:" dichiarazione, sarebbe andare in giro per la messa a punto logging.handlers.SMTPHandler, o intorno alle singole chiamate a my_logger.error ()

È stato utile?

Soluzione

Le eccezioni che si verificano durante la registrazione non dovrebbe smettere di script, anche se può causare una traceback da stampare a sys.stderr. Al fine di evitare questa stampa, effettuare le seguenti operazioni:

logging.raiseExceptions = 0

Questo non è l'impostazione predefinita (in quanto in fase di sviluppo in genere si desidera sapere sugli errori), ma in produzione, raiseExceptions non deve essere impostato.

Si dovrebbe trovare che il SMTPHandler tenterà di ri-connessione la prossima volta che un errore (o superiore) viene registrato.

logging ha passare attraverso SystemExit e KeyboardInterrupt eccezioni, ma tutti gli altri devono essere maneggiate in modo che essi non causano la terminazione di un programma che utilizza la registrazione. Se si scopre che questo non è il caso, si prega di inviare i dettagli specifici delle eccezioni, che sono sempre attraverso e causando lo script per terminare, e circa la vostra versione del sistema / operativo Python. Tenete a mente che lo script sembra bloccarsi se c'è un timeout di rete che sta causando il gestore per bloccare (ad esempio, se una ricerca DNS richiede molto tempo, o se la connessione SMTP richiede molto tempo).

Altri suggerimenti

Probabilmente Hai bisogno di fare entrambe le cose. Per capire questo, suggerisco di installare un server di posta locale e usare quella. In questo modo, è possibile spegnerlo mentre lo script viene eseguito e annotare il messaggio di errore.

Per mantenere il codice mantenibile, si dovrebbe estende SMTPHandler in modo tale che è possibile gestire le eccezioni in un unico luogo (invece di avvolgere ogni chiamata logger con try-tranne).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top