On Error Resume Next en Python
Extrait 1
do_magic() # Throws exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
Extrait 2
try:
do_magic() # Doesn't throw exception, doesn't execute do_foo and do_bar
do_foo()
do_bar()
except:
pass
Extrait 3
try: do_magic(); except: pass
try: do_foo() ; except: pass
try: do_bar() ; except: pass
Est-il un moyen d'écrire du code extrait 3 élégamment?
- si
do_magic()
échoue ou non,do_foo()
etdo_bar()
doit être exécutée. - si
do_foo()
échoue ou non,do_bar()
doit être exécutée.
Dans Basic/Visual Basic/VBS, il y a une déclaration appelée On Error Resume Next
qui le fait.
- Et
On Error Resume Next
est un crime contre le flux de contrôle! - Vous pouvez décorer ces fonctions comme ici? stackoverflow.com/a/9386604/1532474
- Vous seriez intéressé à la la Pièce A et la Pièce B.
- Pour les débutants, il faut dire Extrait 3 ne fonctionne pas. En règle générale, je trouve que Python permet une ":" sur une ligne. Voir ma réponse tout à l'heure. @jonrsharpe, c'est tout simplement ridicule. J'utilise python maintenant, et comme l'OP, je trouve beaucoup de choses en VBA qui n'ont pas de simple remplacement dans une autre langue. VBA de vérification d'erreur est assez profonde, si vous savez comment l'utiliser.
Vous devez vous connecter pour publier un commentaire.
En Python 3.4-delà, vous pouvez utiliser
contextlib.supprimer
:Sinon,
fuckit
.Si tous les trois fonctions acceptent même nombre de paramètres:
Sinon, envelopper l'appel de la fonction avec
lambda
.Si il n'y a pas de paramètres...
Si vous êtes le seul codage de la fucntions, pourquoi ne pas programmer les fonctions de codes d'état de retour? Ensuite, ils seront atomique et vous n'aurez pas à capturer l'erreur dans la section principale. Vous serez également en mesure d'effectuer de restaurer ou de suppléant de codage en cas d'échec.
dans le programme principal..
Beaucoup de ident, mais il fonctionne
vous pouvez essayer un imbriquée essayer boucle, alltho qui pourrait ne pas être aussi élégamment pythonic que vous pourriez vouloir. le lambda de la solution est est également un bon moyen d'aller, de ne pas mentionner car cela a été fait dans la réponse précédente
edit:
edit 2:
bien damnnit, cette réponse viens de recevoir posté secondes d'avance encore une fois 😐
Dans la question, Extrait 3 ne fonctionne pas, mais ne fonctionnera que si vous n'avez pas l'esprit à diviser chaque ligne de plus de deux lignes...
Un exemple de travail..
..si vous enregistrez ce à test.py et puis à l'invite de CMD sous windows il suffit de taper
test.py
il sera de retourNo_Arg1 No_Arg2 No_Arg3
parce qu'il n'y avait pas d'arguments. Cependant, si vous fournissez des arguments, si le typetest.py 111 222
il sera de retour111 222 No_Arg3
etc.(Testé Windows 7, python2.7).
À mon humble avis c'est beaucoup plus élégante que la nidification exemple les réponses. Il est également fonctionne exactement comme on Error Resume Next et je l'utilise lors de la traduction à partir de VB6. Un problème est que la
try
lignes ne peut pas contenir un conditionnel. J'ai constaté qu'en règle générale, python ne peut pas contenir plus d'un:
en ligne. Cela dit, il signifie simplement diviser la déclaration de plus de 3 lignes, etc.