Esiste un modello comune per la propagazione dei dettagli di errori e avvisi? Per errori Intendo problemi gravi che dovrebbero causare l'interruzione del flusso di codice. Per gli avvertimenti Voglio dire problemi che meritano di informare l'utente di un problema, ma sono troppo banali per fermare il flusso del programma.Esiste un modello per la propagazione di dettagli di errori e avvisi?
Attualmente utilizzo eccezioni per gestire errori gravi e il framework di registrazione Python per registrare gli avvisi. Ma ora voglio registrare gli avvertimenti in un campo del database del record attualmente in fase di elaborazione. Immagino, voglio che gli avvertimenti si presentino allo stesso modo delle eccezioni, ma senza interrompere il flusso del programma.
>>> import logging
>>>
>>> def process_item(item):
... if item:
... if item == 'broken':
... logging.warning('soft error, continue with next item')
... else:
... raise Exception('hard error, cannot continue')
...
>>> process_item('good')
>>> process_item(None)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in process_item
Exception: hard error, cannot continue
>>> process_item('broken')
WARNING:root:soft error, continue with next item
Questo esempio (e il mio problema attuale) è in Python, ma dovrebbe valere per altre lingue con le eccezioni troppo.
Seguendo il suggerimento s' David e un breve gioco con l'esempio di seguito, il modulo di Python warnings
è la strada da percorrere.
import warnings
class MyWarning(Warning):
pass
def causes_warnings():
print 'enter causes_warnings'
warnings.warn("my warning", MyWarning)
print 'leave causes_warnings'
def do_stuff():
print 'enter do_stuff'
causes_warnings()
causes_warnings()
causes_warnings()
print 'leave do_stuff'
with warnings.catch_warnings(record=True) as w:
# Cause all warnings to always be triggered.
warnings.simplefilter("always")
# Trigger a number of warnings.
do_stuff()
# Do something (not very) useful with the warnings generated
print 'Warnings:',','.join([str(warning.message) for warning in w])
uscita:
enter do_stuff
enter causes_warnings
leave causes_warnings
enter causes_warnings
leave causes_warnings
enter causes_warnings
leave causes_warnings
leave do_stuff
Warnings: my warning,my warning,my warning
Nota: Python 2.6 + è necessario per catch_warnings
.
FYI, probabilmente sarebbe stato meglio pubblicare la soluzione come risposta, piuttosto che modificarla nella domanda ... bello che l'hai capito, però. –
Avrei messo il mio esempio come commento al tuo, ma non posso fare una bella formattazione in un commento. – Mat
+1 per il follow-up – jfs