2009-02-23 12 views
6

¿Existe un patrón común para propagar detalles de errores y advertencias? Por errores Me refiero a problemas graves que deberían hacer que el flujo de código se detenga. Por advertencias me refiero a problemas que ameritan informar al usuario de un problema, pero son demasiado triviales para detener el flujo del programa.¿Hay un patrón para propagar detalles de errores y advertencias?

Actualmente, utilizo excepciones para tratar los errores difíciles, y el marco de registro de Python para registrar advertencias. Pero ahora quiero grabar advertencias en un campo de base de datos del registro que se está procesando actualmente. Supongo que quiero que las advertencias aparezcan de la misma manera que las excepciones, pero sin detener el flujo del programa.

>>> 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 

Este ejemplo (y mi problema actual) es en Python, pero debe aplicarse a otros idiomas con excepciones también.


Siguiendo la sugerencia David 's y una breve obra de teatro con el siguiente ejemplo, el módulo de Python warnings es el camino a seguir.

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]) 

Salida:

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+ es necesario para catch_warnings.

+0

Para su información, probablemente hubiera sido mejor publicar su solución como una respuesta, en lugar de editarla en la pregunta ... aunque ya lo entendió. –

+0

Hubiera puesto mi ejemplo como un comentario en el suyo, pero no puedo hacer un buen formato en un comentario. – Mat

+0

+1 para el seguimiento – jfs

Respuesta

7

Mire en el interior del módulo de Python warnings, http://docs.python.org/library/warnings.html

no creo que haya mucho que se puede decir acerca de este problema, sin especificar el idioma, como el control de errores no terminal varía mucho de un idioma a otro.

+0

+1: módulo de advertencias. Icky para configurar la primera vez (tan muchas opciones) pero una vez configurado, gobierna. –

+0

advertencias de cruzamiento y módulos de registro no es fácil, pero es posible con algún trabajo. – jfs

-1

Los errores graves deberían aparecer, la advertencia debería iniciarse sin generar excepciones.

Cuestiones relacionadas