Ich habe ein Python-Skript, das einen MySQL-Server auf einem gemeinsam genutzten Linux-Host abfragt. Aus irgendeinem Grund geben Abfragen an MySQL häufig den Fehler "Server ist weg" zurück:
_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')
Wenn Sie die Abfrage unmittelbar danach erneut versuchen, ist sie normalerweise erfolgreich. Ich würde gerne wissen, ob es in Python eine sinnvolle Möglichkeit gibt, eine Abfrage auszuführen, und wenn dies fehlschlägt, versuchen Sie es erneut, bis zu einer festgelegten Anzahl von Versuchen. Wahrscheinlich möchte ich, dass es 5 Mal versucht wird, bevor ich ganz aufgebe.
Hier ist die Art von Code, die ich habe:
conn = MySQLdb.connect(host, user, password, database)
cursor = conn.cursor()
try:
cursor.execute(query)
rows = cursor.fetchall()
for row in rows:
# do something with the data
except MySQLdb.Error, e:
print "MySQL Error %d: %s" % (e.args[0], e.args[1])
Natürlich könnte ich es tun, indem ich einen weiteren Versuch in der Ausnahmeklausel mache, aber das ist unglaublich hässlich, und ich habe das Gefühl, dass es einen anständigen Weg geben muss, um dies zu erreichen.
Antworten:
Wie wäre es mit:
quelle
for attempt_number in range(3)
while
Endlosschleifen als die meisten Menschen.Aufbauend auf Danas Antwort möchten Sie dies vielleicht als Dekorateur tun:
Dann...
Erweiterte Version, die das
decorator
Modul verwendetDann...
So installieren Sie das
decorator
Modul :quelle
UPDATE: gibt es eine besseren gehaltene Gabel der retrying Bibliothek namens Hartnäckigkeit , die mehr Funktionen unterstützt und ist in der Regel flexibler.
Ja, es gibt die Wiederholungsbibliothek mit einem Dekorator, der verschiedene Arten von Wiederholungslogik implementiert, die Sie kombinieren können:
Einige Beispiele:
quelle
quelle
else: raise TooManyRetriesCustomException
Ich würde es so umgestalten:
Das Ausklammern der
callee
Funktion scheint die Funktionalität aufzubrechen, so dass die Geschäftslogik leicht zu erkennen ist, ohne im Wiederholungscode hängen zu bleiben.quelle
Wie S.Lott mag ich eine Flagge, um zu überprüfen, ob wir fertig sind:
quelle
quelle
1. Definition:
2.Verwendung:
Ich benutze es zum Parsen von HTML-Kontext.
quelle
Dies ist meine generische Lösung:
Dies ermöglicht Code wie den folgenden:
Auch möglich:
Ich hoffe, dies kann verbessert werden, indem Ausnahmen intuitiver behandelt werden. Offen für Vorschläge.
quelle
Sie können eine
for
Schleife mit einerelse
Klausel verwenden, um maximale Wirkung zu erzielen:Der Schlüssel ist, aus der Schleife auszubrechen, sobald die Abfrage erfolgreich ist. Die
else
Klausel wird nur ausgelöst, wenn die Schleife ohne a abgeschlossen istbreak
.quelle