Domanda

  • vorrei evitare di scrittura errorCount += 1 in più di un posto.
  • Sto cercando un modo migliore di
    success = False
    try:
        ...
    else:
        success = True
    finally:
        if success:
            storage.store.commit()
        else:
            storage.store.rollback()
  • Sto cercando di evitare store.rollback() in ogni clausola except.

Qualche idea su come fare questo?

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)
È stato utile?

Soluzione

Questo sguardo come una possibile applicazione della nuova dichiarazione with di Python. Permette di rilassarsi operazioni e liberare risorse in modo sicuro non importa quale sia il risultato di un blocco di codice ha avuto.

Leggi su di esso in PEP 343

Altri suggerimenti

Il mio suggerimento sarebbe di scrivere un metodo che incrementa logError() errorCount (renderlo una variabile membro) e stampa l'errore. Dal momento che il codice di eccezione è simile, si potrebbe anche ridurre il codice in questo modo:

try:
    # something
except (CustomerNotFoundError, ProductNotFoundError), e:
    logError(e)

È possibile stampare quello che vuoi in base a e.

Inoltre, non c'è bisogno di tenere traccia succeses: successCount = len(rows) - errorCount

Si potrebbe semplicemente spostare in su l'implementazione eccezione all'interno di una specifica classe contenitore eccezione, in questo modo si potrebbe anche evitare tutte queste chiamate di stampa esplicite (che possono tornare utili una volta che si cambia l'interfaccia, ad esempio quando sostenendo una GUI), invece si avrebbe un metodo come errore (MSG), che a sua volta potrebbe aumentare internamente il conteggio degli errori di conseguenza. In altre parole, è sufficiente impostare una classe di supporto esterno che gestisce la tua roba gestione delle eccezioni.

Se ti piace cumulare gli errori perché non cumulare gli errori? Se si mettono i messaggi di errore in un elenco delle dimensioni del elenco fornisce le informazioni necessarie. Si può anche postelaborare qualcosa. Si può decidere facilmente in caso di errore e di stampa viene chiamato solo in un unico luogo

Ebbene, secondo questa pagina, parte 7.4:

http://docs.python.org/reference/compound_stmts.html

Questo è possibile con pitone ver. > = 2.6. Voglio dire la costruzione try..except..finally.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top