8
votes

python continue avec sauf si la condition n'est pas satisfaite

Je me trouve souvent vouloir faire quelque chose comme ça, j'ai quelque chose d'enveloppé d'essayer des exssides comme ceci xxx

est un moyen de collecter dans le sauf Bloquer ci-dessous de l'autre? (un Continuer serait bien) Je finis à faire quelque chose comme ce qui suit, ce qui n'est pas aussi propre xxx

est là pour faire cela?


2 commentaires

Contrôlez-vous l'exception que Do_work jette? Vous pouvez simplement faire une exception spécifique pour le code d'erreur "123" et attraper cela à do_something sinon le gérer par votre bloc d'exception.


Nope, j'ai pensé à cela, mais malheureusement, j'essaie de gérer des codes d'erreur spécifiques S3ResponseError de Boto


4 Réponses :


9
votes

Si vous utilisez une version python suffisante récente (2.5 et UP), vous devez passer à l'aide d'un Context Manager à la place:

item = get_item()
try:
    do_work(item)
    item = None
except SomeError as err:
    if err.code == 123:
        do_something(item)
        item = None
finally:
    if item is not None:
        put_back(item)


6 commentaires

Le bloc "enfin" fonctionnera même s'il n'y a pas une exception soulevée. Je vois que vous mettez le "si l'article n'est pas Aucun", mais cela peut ne pas être identique à un message d'erreur.


HM, je ne suis pas convaincu que ceci est une solution plus agréable que le deuxième exemple de la question. Je devrais vous rappeler de définir l'article sur n'importe quel endroit où je gère une exception. Plus le cas où l'article n'était pas à ne pas commencerait de masquer une manipulation d'erreur


@ GP89: La meilleure méthode consiste à utiliser un gestionnaire de contexte; Mise à jour de la réponse pour fournir un exemple.


Pensez que c'est aussi bon que vous pouvez obtenir. Il y a toujours le tirage du code de gestionnaire de duplication dans sauf et dans __ sortie __ , il pourrait être mis dans une fonction, mais toujours .. plus quelqu'un qui vient au code plus tard pourrait être confus pourquoi sauf someexception ne reçoit pas le code d'erreur 123. Je pense que la meilleure solution serait si la langue changeait donc Continuer avait le comportement dans mon premier exemple (je pense actuellement Continuer dans un sauf toujours élever une erreur de syntaxe? Donc, il pourrait être ajouté théoriquement) Où puis-je faire des suggestions pour la langue lol?


@ GP89: Que le point d'un gestionnaire de contexte: il y a non besoin d'un gestionnaire d'exception plus, car le cm est votre gestionnaire d'exception (voir le si exc_type n'est pas Aucun: Partie, aucune exception signifie qui n'est pas exécutée).


Ah, je vois! J'ai raté ce point. Je pensais que le gestionnaire de contexte était juste une manipulation someexception 123 et qui était toujours à l'intérieur du , sauf . C'est une belle solution :)



1
votes

Il est bon de garder à l'esprit ce que l'essaie, sauf le flux, et l'un de leurs avantages est qu'ils suppriment le besoin de variables d'état et de vérifications d'état comme xxx

aussi, une exception La classe devrait représenter un type d'erreur spécifique. Si vous devez prendre des décisions supplémentaires sur le type d'erreur dans un bloc sauf, c'est un bon signe que la classe n'est pas suffisamment spécifique pour représenter l'état du programme. Votre meilleur pari est de sous-classer quelque part d'expérience et n'atteignez que la sous-classe dans la première sauf. Ensuite, d'autres instances de quelqueerError vont tomber à la seconde sauf bloc.


1 commentaires

Je voudrais, mais malheureusement ce n'est pas mon code qui jette l'exception



2
votes

Ma suggestion serait de créer une fonction (ou une série de fonctions) qui enveloppe les erreurs de lancement de la méthode que vous souhaitez contrôler. Quelque chose comme ... xxx

... alors, lorsque vous souhaitez l'appeler ... xxx


0 commentaires

2
votes

Les gestionnaires de contexte sont excellents, mais pour certains cas simples où vous ne réutiliserez pas la logique nulle part ailleurs, ils peuvent être un peu lourds.

au lieu d'essayer de faire plusieurs sauf Blocks , vous pouvez simplement tester l'exception à l'intérieur d'un seul sauf bloc: xxx

Notez que cela est à peu près ce qu'est la __ d'un gestionnaire de contexte __ < / Code> La méthode finit par apparaître, de toute façon.

se méfier ce code qui appartient vraiment à enfin ne finit pas ici.


0 commentaires