Neu bei Python und ich habe eine Reihe von Funktionen, um verschiedene Aufgaben auf etwas Hardware durchzuführen. Jede Funktion hat unterschiedliche Anzahlen von Parametern und gibt zurück.Ausnahmebehandlung in Decorator-Funktion
Ich möchte eine Art generische "wiederholen" Wrapper-Funktion, die eine Ausnahme von jeder meiner Funktionen abfangen und einige Fehlerbehandlung (wie das Wiederholen der Aufgabe).
Von was ich verstehe, sollte ich in der Lage sein, eine Decorator-Funktion als generische Wrapper für jede meiner Funktionen zu verwenden. Das scheint zu funktionieren, aber ich bin anscheinend nicht in der Lage, irgendeine Ausnahme von der aufgerufenen Funktion von meiner Decorator-Funktion zu bekommen.
Ich habe an verschiedenen Beispielen sah und kommen mit dieser:
def retry(function):
def _retry(*args, **kwargs):
try:
reply = function(*args, **kwargs)
print "reply: ", reply
return reply
except PDError as msg:
print "_retry", msg
except:
print "_retry: another error"
return _retry
Dann rufe ich ihm den Namen einer meiner Funktionen:
value = retry(pd.command_get_parameter(0x00))
Es scheint, meine Funktion aufzurufen und korrekt zurückgeben, aber die Ausnahmen werden nie innerhalb meiner Wiederholungsfunktion abgefangen. So kann ich einen Fehler nicht behandeln und eine Wiederholung versuchen.
Ich habe dies auch versucht:
from functools import wraps
def retry(function):
@wraps(function)
def _retry(*args, **kwargs):
.....
Ich bin nicht sicher, was ich falsch mache, oder ob dies auch der beste Weg, dies zu tun. Hat jemand einen Vorschlag, wie man das macht? Ich möchte nicht wirklich separate "Wiederholungs" -Funktionen für jede meiner Hauptfunktionen machen müssen.
Meinten Sie 'Wiederholungs (pd.command_get_parameter) (0x00)'? Im Moment übergeben Sie das Ergebnis von 'pd.command_get_parameter (0x00)' an 'retry' als' function'. – Ryan
@Will: Sie sollten wie folgt verwenden: '@retry def command_get_parameter (..)'. Sie können auch eine Funktion wie 'retry (command_get_parameter)' übergeben und stattdessen die zurückgegebene Funktion verwenden. Du machst keinen von beiden. Sie übergeben den zurückgegebenen Wert von 'command_get_parameter (..)', um es erneut zu versuchen - wo Sie eine Funktion übergeben sollten. – SuperSaiyan
@Ryan: Danke. Jetzt, wo du es erklärt hast, kann ich sehen, warum es nicht funktioniert hat, weil ich das Ergebnis weitergegeben habe. – Will