2009-05-18 6 views
3
  • Je voudrais éviter d'écrire errorCount += 1 en plusieurs endroits.
  • Je suis à la recherche d'une meilleure façon que
 
    success = False 
    try: 
     ... 
    else: 
     success = True 
    finally: 
     if success: 
      storage.store.commit() 
     else: 
      storage.store.rollback() 
  • J'essaie d'éviter store.rollback() dans toutes sauf clause.

Une idée sur la façon de faire cela?essayez ... sauf ... sauf ...: comment éviter de répéter le code

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) 

Répondre

8

Ce regard comme une application possible de la nouvelle déclaration with Python. Il permet de dérouler les opérations et de libérer des ressources en toute sécurité, quel que soit le résultat d'un bloc de code.

lu dans PEP 343

+1

On dirait que mon code pourrait s'améliorer en utilisant l'instruction with. –

2

Vous pouvez simplement envelopper votre mise en œuvre d'exception dans une classe d'exception conteneur spécifique, de cette façon vous pouvez également éviter tous ces appels d'impression explicites (ce qui peut être utile une fois que vous changez votre interface, par exemple en soutenant une interface graphique), à la place vous auriez une méthode comme error (msg), qui à son tour pourrait augmenter en interne le nombre d'erreurs en conséquence. En d'autres termes, configurez simplement une classe d'assistance externe qui gère vos éléments de gestion des exceptions.

0

Si vous aimez cumuler les erreurs pourquoi vous ne cumulez pas les erreurs? Si vous placez les messages d'erreur sur une liste, la taille de la liste vous donne les informations dont vous avez besoin. Vous pouvez même post-traiter quelque chose. Vous pouvez décider facilement si une erreur est survenue et l'impression est appelée uniquement à un seul endroit

3

Ma suggestion serait d'écrire une méthode logError() qui incrémente errorCount (en faire une variable membre) et imprime l'erreur. Étant donné que votre code d'exception est similaire, vous pouvez aussi écourter votre code en faisant ceci:

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

Vous pouvez imprimer ce que vous voulez sur la base e.

, vous n'avez pas besoin de suivre succeses: successCount = len(rows) - errorCount

+0

successCount = len (lignes) - errorCount: ne fonctionne pas toujours dans mon exemple car je ne travaille pas toujours directement avec les lignes. –

+0

Il existe de nombreuses bonnes raisons de créer une méthode unique qui traite les objets d'exception et l'appelle chaque fois que votre code intercepte une exception qui est une erreur. –