try ... except ... tranne che ...: come evitare di ripetere il codice
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)
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.