¿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
.
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ó. –
Hubiera puesto mi ejemplo como un comentario en el suyo, pero no puedo hacer un buen formato en un comentario. – Mat
+1 para el seguimiento – jfs