Lorsque vous voulez simplement faire un essai, sauf sans gérer l'exception, comment faites-vous en Python?
Est-ce que la bonne façon de procéder est la suivante?
try:
shutil.rmtree(path)
except:
pass
python
exception
try-except
Joan Venge
la source
la source
shutil.rmtree(path, ignore_errors=True)
. Cependant, cela ne s'applique pas à la plupart des fonctions.try: rob() except: run()
Réponses:
ou
La différence est que le premier attrapera également
KeyboardInterrupt
,SystemExit
et des trucs comme ça, qui sont dérivés directement deexceptions.BaseException
, nonexceptions.Exception
.Voir la documentation pour plus de détails:
try
déclarationla source
try: shuti.rmtree(...) except: pass
supprimera grossièrement toutes les erreurs (même si vous mal orthographiéshutil
résultant en unNameError
) - à tout le moinsexcept OSError:
Il est généralement considéré comme la meilleure pratique de ne détecter que les erreurs qui vous intéressent. Dans le cas,
shutil.rmtree
c'est probablementOSError
:Si vous voulez ignorer silencieusement cette erreur, vous feriez:
Pourquoi? Supposons que vous (en quelque sorte) transmettez accidentellement à la fonction un entier au lieu d'une chaîne, comme:
Cela donnera l'erreur "TypeError: coercing to Unicode: need string or buffer, int found" - vous ne voudrez probablement pas ignorer cela, ce qui peut être difficile à déboguer.
Si vous voulez vraiment ignorer toutes les erreurs, attrapez
Exception
plutôt qu'une simpleexcept:
déclaration. Encore une fois, pourquoi?Ne pas spécifier d'exception intercepte toutes les exceptions, y compris l'
SystemExit
exception quisys.exit()
utilise par exemple :Comparez cela aux éléments suivants, qui se terminent correctement:
Si vous voulez écrire du code qui se comporte toujours mieux, l'
OSError
exception peut représenter diverses erreurs, mais dans l'exemple ci-dessus, nous voulons seulement ignorerErrno 2
, donc nous pourrions être encore plus spécifiques:la source
shutil.rmtree
n'est pas le meilleur exemple, car vous utiliseriez simplementignore_errors=True
cette fonction ..Cela dépend de ce que vous entendez par «manipulation».
Si vous voulez l'attraper sans rien faire, le code que vous avez publié fonctionnera.
Si vous voulez dire que vous voulez agir sur une exception sans empêcher l'exception de remonter la pile, alors vous voulez quelque chose comme ceci:
la source
Je cite d'abord la réponse de Jack o'Connor de ce fil . Le fil référencé a été fermé donc j'écris ici:
"Il existe une nouvelle façon de faire cela à venir dans Python 3.4:
Voici le commit qui l'a ajouté: http://hg.python.org/cpython/rev/406b47c64480
Et voici l'auteur, Raymond Hettinger, qui parle de cela et de toutes sortes d'autres points forts de Python: https://youtu.be/OSGv2VnC0go?t=43m23s
Mon ajout à cela est l'équivalent Python 2.7:
Ensuite, vous l'utilisez comme dans Python 3.4:
la source
Pour être complet:
Notez également que vous pouvez capturer l'exception comme ceci:
... et relancez l'exception comme ceci:
... des exemples du tutoriel python .
la source
Il existe plusieurs façons de procéder.
Cependant, le choix de l'exemple a une solution simple qui ne couvre pas le cas général.
Spécifique à l'exemple:
Au lieu de
Faites ceci:
Il s'agit d'un argument spécifique à
shutil.rmtree
. Vous pouvez voir l'aide à ce sujet en procédant comme suit, et vous verrez qu'il peut également permettre la fonctionnalité sur les erreurs.Étant donné que cela ne couvre que le cas étroit de l'exemple, je vais montrer plus en détail comment gérer cela si ces arguments de mots clés n'existaient pas.
Approche générale
Étant donné que ce qui précède ne couvre que le cas étroit de l'exemple, je vais montrer plus en détail comment gérer cela si ces arguments de mots clés n'existaient pas.
Nouveau dans Python 3.4:
Vous pouvez importer le
suppress
gestionnaire de contexte:Mais ne supprimez que l'exception la plus spécifique:
Vous ignorerez silencieusement
FileNotFoundError
:De la documentation :
Notez que
suppress
etFileNotFoundError
ne sont disponibles qu'en Python 3.Si vous souhaitez que votre code fonctionne également en Python 2, consultez la section suivante:
Python 2 & 3:
Pour le code compatible Python 2,
pass
est la bonne façon d'avoir une déclaration qui est un no-op. Mais quand vous faites un nuexcept:
, qui est la même chose que faire ceexcept BaseException:
qui comprendGeneratorExit
,KeyboardInterrupt
etSystemExit
, en général, vous ne voulez pas attraper ces choses.En fait, vous devez être aussi précis que possible pour nommer l'exception.
Voici une partie de la hiérarchie des exceptions Python (2) , et comme vous pouvez le voir, si vous interceptez des exceptions plus générales, vous pouvez masquer les problèmes auxquels vous ne vous attendiez pas:
Vous voulez probablement attraper une OSError ici, et peut-être que l'exception dont vous vous souciez est s'il n'y a pas de répertoire.
Nous pouvons obtenir ce numéro d'erreur spécifique dans la
errno
bibliothèque et relancer si nous ne l'avons pas:Remarque, une augmentation nue déclenche l'exception d'origine, ce qui est probablement ce que vous voulez dans ce cas. Écrit de manière plus concise, car nous n'avons pas vraiment besoin de le faire explicitement
pass
avec du code dans la gestion des exceptions:la source
Cela vous aidera à imprimer ce qu'est l'exception :( c.-à-d. Essayez d'attraper sans gérer l'exception et imprimez l'exception.)
la source
Pour info la clause else peut aller après toutes les exceptions et ne sera exécutée que si le code de l'essai ne provoque pas d'exception.
la source
else
dans ce contexte. Et d'ajouter quefinally
sera toujours courir après tout (ou pas exception).J'avais besoin d'ignorer les erreurs dans plusieurs commandes et putain a fait l'affaire
la source
En Python, nous gérons des exceptions similaires à d'autres langages, mais la différence est une différence de syntaxe, par exemple,
la source
Je fais habituellement juste:
la source
_ = ""
parpass
.