J'ai du code qui représente un cas de test dans un cadre de test propriétaire qui ressemble à ceci:

def test_alarm(self):
    self.setup_some_test_data()
    try:
        self.send_alarm_message()
    except:
        print "Unexpected error:", sys.exc_info()
    finally:
        self.teardown_some_test_data()

On m'a dit de laisser tomber l'impression car ce n'est pas nécessaire et le cadre de test détectera de toute façon toutes les exceptions, ce qui est préférable de les attraper ici, mais je dois toujours effacer les données, comme dans {{X0 }} bloquer.

Dois-je simplement supprimer complètement le bloc except? Sinon, comment puis-je structurer le code pour avoir effectivement un bloc except vide et conserver le finally? Est-ce une bonne pratique en Python ou existe-t-il une meilleure façon de le faire?

Modifier Notez que j'ai essayé de supprimer complètement le bloc except, et je n'ai eu aucun problème d'exécution évident, bien que comme des exceptions sont peu probables dans l'appel à send_alarm_message(), il n'était pas clair pour moi comment cela fonctionnerait si une exception était levée ou si cela était considéré comme une bonne pratique par la communauté Python.

-3
Component 10 17 juil. 2015 à 12:20

3 réponses

Meilleure réponse

Oui, vous pouvez supprimer complètement le bloc except, c'est une syntaxe python valide pour avoir juste try et finally. Exemple -

In [58]: try:
   ....:     print("Blah")
   ....: finally:
   ....:     print("halB")
   ....:
Blah
halB

Veuillez noter que cela ne détectera aucune exception / erreur qui se produira dans le bloc try, et je suppose que c'est ce que vous voulez.

J'ai vu cela utilisé à de nombreux endroits, où nous créons des variables / ressources qui doivent être effacées, que des exceptions / erreurs se produisent, mais nous ne voulons pas gérer d'exceptions à cet endroit particulier.

1
Anand S Kumar 17 juil. 2015 à 09:23

Si vous ne voulez rien faire dans le bloc except, vous pouvez le pass.

try:
    self.send_alarm_message()
except:
    pass
finally:
    self.teardown_some_test_data()
1
Sudipta 17 juil. 2015 à 09:41

Soit déposez le bloc sauf, soit améliorez-le vraiment en ajoutant

except [Exception-Class]:
    pass

Où [Exception-Class] est l'exception à exclure. Cela ajoute un peu de sucre, car des erreurs vraiment inattendues ne sont pas capturées par cela. (Ou ajoutez ceci séparément:

except Exception, ex:
    print "Unexpected error:", ex
2
decontamin4t0R 17 juil. 2015 à 09:24