try ... except ... außer ...: wie man vermeiden, Code zu wiederholen
Frage
- würde Ich mag
errorCount += 1
in mehr als einem Ort writting zu vermeiden. - Ich bin auf der Suche nach einem besseren Weg als
success = False try: ... else: success = True finally: if success: storage.store.commit() else: storage.store.rollback()
- Ich versuche
store.rollback()
in jedem außer Klausel zu vermeiden.
Jede Idee, wie dies zu tun?
count = 0
successCount = 0
errorCount = 0
for row in rows:
success = False
count += 1
newOrder = storage.RepeatedOrder()
storage.store.add(newOrder)
try:
try:
newOrder.customer = customers[row.customer_id]
except KeyError:
raise CustomerNotFoundError, (row.customer_id,)
newOrder.nextDate = dates[row.weekday]
_fillOrder(newOrder, row.id)
except CustomerNotFoundError as e:
errorCount += 1
print u"Error: Customer not found. order_id: {0}, customer_id: {1}".format(row.id, e.id)
except ProductNotFoundError as e:
errorCount += 1
print u"Error: Product not found. order_id: {0}, product_id: {1}".format(row.id, e.id)
else:
success = True
successCount += 1
finally:
if success:
storage.store.commit()
else:
storage.store.rollback()
print u"{0} of {1} repeated orders imported. {2} error(s).".format(successCount, count, errorCount)
Lösung
Diese sieht aus wie eine mögliche Anwendung von Python neuer with
Aussage. Es ermöglicht auf Operationen abzuwickeln und Ressourcen freigeben sicher, egal welches Ergebnis ein Codeblock hatte.
Lesen Sie mehr über sie in PEP 343
Andere Tipps
Mein Vorschlag wäre eine logError()
Methode zu schreiben, die errorCount
erhöht (es eine Membervariable) und druckt den Fehler. Da Ihr Code Ausnahme ähnlich ist, können Sie auch Ihren Code verkürzen, indem dies zu tun:
try:
# something
except (CustomerNotFoundError, ProductNotFoundError), e:
logError(e)
Sie können drucken, was Sie basiert auf e
wollen.
Auch Sie brauchen nicht succeses zu verfolgen: successCount = len(rows) - errorCount
Sie könnten einfach einpacken Ihre Ausnahme Implementierung innerhalb einer Ausnahme bestimmten Container-Klasse, da man so auch alle diese expliziten Druck Anrufe vermeiden könnte (was nützlich sein kann, wenn Sie Ihre Schnittstelle ändern, zB wenn ein GUI-Unterstützung), anstatt Sie würde eine Methode, wie Fehler (msg), die intern wiederum entsprechend die Fehlerzahl erhöhen könnte. Mit anderen Worten, einfach eine externe Hilfsklasse einrichten, die Ihre Ausnahmebehandlung Sachen verwaltet.
Wenn Sie die Fehler kumulieren möchten, warum Sie die Fehler nicht kumulieren? Wenn Sie die Fehlermeldungen auf einer Liste der Größe der Liste setzen gibt die Informationen, die Sie benötigen. Sie können sogar etwas nachbearbeiten. Sie können entscheiden, einfach, wenn ein Fehler aufgetreten ist und Druck nur an einer einzigen Stelle genannt wird,
Nun, nach dieser Seite, Teil 7.4:
http://docs.python.org/reference/compound_stmts.html
Dies ist möglich, mit Python ver. > = 2,6. Ich meine try..except..finally Bau.