2016-04-25 10 views
2

Code Mein Projekt ist voll von Blöcken wie folgt aus:Kann ich das Verhalten von "Raise" oder "Exception" ändern?

try: 
    execute_some_code() 
except Exception: 
    print(datetime.datetime.now()) 
    raise 

einfach, weil, wenn ich eine Fehlermeldung erhalten, würde ich gerne wissen, wann es passiert ist. Ich finde es ziemlich albern, diesen Code immer und immer wieder zu wiederholen, und ich würde es gern wegzählen.

Ich möchte nicht execute_some_code mit etwas verzieren, das die Fehlererfassung (weil manchmal ist es nur ein Block von Code und nicht ein Funktionsaufruf, und manchmal brauche ich nicht genau die gleiche Funktion, um so zu dekorieren). Ich möchte auch nicht stdout auf einen anderen Stream umleiten, der alles protokolliert, denn das würde alle anderen Dinge beeinflussen, die ebenfalls an stdout gesendet werden.

Im Idealfall würde Ich mag das Verhalten entweder die raise Aussage über-Fahrt (zum Drucken auch datetime.datetime.now() bei jeder Ausführung) oder die Exception Klasse, vorab pend alle seine Nachrichten mit der Zeit. Ich kann leicht unter Exception Unterklasse, aber dann würde ich sicherstellen müssen, dass meine Funktionen eine Instanz dieser Unterklasse auslösen, und ich hätte genauso viel Code-Duplizierung wie derzeit.

Ist eine dieser Optionen möglich?

+0

Verwenden Sie einen Debugger eine Option für Sie? – xuhdev

+0

Ich sollte über 'sys.excepthook' schreiben, aber @ IljaEverilä schlug mich dazu, den Dupe zu finden. – Boldewyn

Antwort

0

Sie könnten in der Lage sein, Python zu ändern (Ich würde Code lesen um sicher zu sein, wie komplex das sein würde), aber:

Sie tun nichtraise mit unterschiedlichem Verhalten ersetzen wollen - versuchen, und Fangen ist ein sehr pythischer Ansatz zur Problemlösung, also gibt es sehr viel Code, der zB sehr gut funktioniert eine Methode aufrufen und diese Methode eine Ausnahme auslösen lassen, die unter normalen Umständen auffängt. Wir können also diesen Ansatz ausschließen - Sie wollen nur die Ausnahmen kennen, die Ihnen wichtig sind, nicht die, die während des Betriebs normal sind.

Das gleiche gilt eine Aktion für die Auslösung, wenn eine Exception Instanz erstellt wird - aber:

Sie könnten den globalen Namespace zu überschreiben können,; zumindest für Dinge, die initialisiert werden, nachdem Sie Ihre eigene Klasse Exception deklariert haben. Sie könnten dann eine message Eigenschaft hinzufügen, die einen Zeitstempel enthält. Tu dies aber nicht - es könnte Leute geben, die sich tatsächlich darauf verlassen, dass die Nachricht automatisch auf Ausnahmen reagiert (schlechter Stil, aber immer noch nicht wirklich selten, leider).

Verwandte Themen