2009-02-23 4 views
6

Gibt es ein gemeinsames Muster für die Weitergabe von Details von Fehlern und Warnungen? Von Fehler Ich meine ernsthafte Probleme, die den Fluss des Codes stoppen sollte. Von Warnungen Ich meine Probleme, die den Benutzer über ein Problem informieren, aber zu trivial sind, um den Programmfluss zu stoppen.Gibt es ein Muster für die Weitergabe von Details von Fehlern und Warnungen?

Ich verwende derzeit Ausnahmen, um mit schweren Fehlern umzugehen, und das Python-Logging-Framework, um Warnungen aufzuzeichnen. Aber jetzt möchte ich Warnungen in einem Datenbankfeld des gerade bearbeiteten Datensatzes aufzeichnen. Ich denke, ich möchte, dass die Warnungen genauso auftauchen wie Ausnahmen, aber ohne den Programmfluss zu stoppen.

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

Dieses Beispiel (und mein aktuelles Problem) ist in Python, aber es sollte auch mit Ausnahmen für andere Sprachen gilt.


Nach David ‚s Vorschlag und einem kurzen Spiel mit dem folgenden Beispiel Python warnings Modul ist der Weg zu gehen.

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

Ausgang:

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 

Hinweis: Python 2.6+ für catch_warnings erforderlich ist.

+0

FYI, es wäre wahrscheinlich besser gewesen, Ihre Lösung als Antwort zu posten, anstatt sie in die Frage zu schreiben ... schön, dass Sie es herausgefunden haben. –

+0

Ich hätte mein Beispiel als Kommentar zu Ihrem Kommentar eingegeben, aber ich kann in einem Kommentar keine schöne Formatierung vornehmen. – Mat

+0

+1 für das Follow-up – jfs

Antwort

7

Blick in die Python warnings Modul, http://docs.python.org/library/warnings.html

Das glaube ich nicht, dass es viel Sie über dieses Problem, ohne die Sprache zu bestimmen, sagen kann, als nicht-Terminal Fehlerbehandlung stark von einer Sprache zur anderen variiert.

+0

+1: Warnungsmodul. Icky, das erste Mal zu konfigurieren (soooo viele Optionen), aber einmal konfiguriert es Regeln. –

+0

Kreuzungswarnungen und Logging-Module sind nicht einfach, aber es ist mit etwas Arbeit möglich. – jfs

-1

Schwerwiegende Fehler sollten platzen, die Warnung sollte nur protokolliert werden, ohne Ausnahmen auszulösen.

Verwandte Themen