Question

  • j'aimerais éviter d'écrire errorCount += 1 à plus d'un endroit.
  • Je cherche un meilleur moyen que
    success = False
    try:
        ...
    else:
        success = True
    finally:
        if success:
            storage.store.commit()
        else:
            storage.store.rollback()
  • J'essaie d'éviter store.rollback() dans chaque clause sauf.

Une idée sur la façon de procéder ?

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)
Était-ce utile?

La solution

Ce regard comme une application possible de la nouvelle déclaration de with Python. Il permet de se détendre opérations et dégager des ressources en toute sécurité, peu importe quel résultat un bloc de code a.

Lisez à ce sujet dans PEP 343

Autres conseils

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

Vous pouvez simplement envelopper votre implémentation d'exception dans une classe de conteneur spécifique à l'exception, de cette façon vous pourrez également éviter tous ces appels d'impression explicites (ce qui peut s'avérer utile une fois que vous modifiez votre interface, par ex.lors de la prise en charge d'une interface graphique), vous auriez à la place une méthode telle que 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 votre gestion des exceptions.

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

Eh bien, selon cette page, partie 7.4:

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

Ceci est possible avec python ver. > = 2.6. Je veux dire la construction try..except..finally.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top