Je me trouve souvent vouloir faire quelque chose comme ça, j'ai quelque chose d'enveloppé d'essayer des exssides comme ceci est un moyen de collecter dans le est là pour faire cela? p> p> sauf code> Bloquer ci-dessous de l'autre? (un
Continuer code> serait bien) Je finis à faire quelque chose comme ce qui suit, ce qui n'est pas aussi propre p>
4 Réponses :
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)
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 code> et dans
__ sortie __ code>, il pourrait être mis dans une fonction, mais toujours .. plus quelqu'un qui vient au code plus tard pourrait être confus pourquoi
sauf someexception code> ne reçoit pas le code d'erreur 123. Je pense que la meilleure solution serait si la langue changeait donc
Continuer code> avait le comportement dans mon premier exemple (je pense actuellement
Continuer Code> 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 i> besoin d'un gestionnaire d'exception plus, car le cm est votre gestionnaire d'exception (voir le si exc_type n'est pas Aucun: code> 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 code> 123 et qui était toujours à l'intérieur du
, sauf code>. C'est une belle solution :)
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 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. P> p>
Je voudrais, mais malheureusement ce n'est pas mon code qui jette l'exception
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 ... ... alors, lorsque vous souhaitez l'appeler ... p>
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 Notez que cela est à peu près ce qu'est la se méfier ce code qui appartient vraiment à sauf code> Blocks , vous pouvez simplement tester l'exception à l'intérieur d'un seul
sauf code> bloc: p>
__ d'un gestionnaire de contexte __ < / Code> La méthode finit par apparaître, de toute façon. p>
enfin code> ne finit pas ici. p> p>
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 code> 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 code> de
Boto code>