2009-02-23 6 views
6

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.

+0

FYI, probabilmente sarebbe stato meglio pubblicare la soluzione come risposta, piuttosto che modificarla nella domanda ... bello che l'hai capito, però. –

+0

Avrei messo il mio esempio come commento al tuo, ma non posso fare una bella formattazione in un commento. – Mat

+0

+1 per il follow-up – jfs

risposta

7

sguardo nel modulo di Python warnings, http://docs.python.org/library/warnings.html

Non credo ci sia molto si può dire su questo problema senza specificare la lingua, come la gestione degli errori non terminale varia notevolmente da una lingua all'altra.

+0

+1: modulo di avviso. Icky da configurare la prima volta (veramente tante opzioni) ma una volta configurato le regole. –

+0

Gli avvisi e i moduli di registrazione incrociati non sono facili ma è possibile con un po 'di lavoro. – jfs

-1

Gli errori gravi devono essere evidenziati, l'avviso deve essere registrato senza eccezioni.