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)
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top