Lorsque vous utilisez PyCharm IDE, l'utilisation de except:
sans type d'exception déclenche un rappel de l'EDI indiquant que cette clause d'exception est Too broad
.
Dois-je ignorer ce conseil? Ou est-ce pythonique de toujours spécifier le type d'exception?
Réponses:
Il est presque toujours préférable de spécifier un type d'exception explicite. Si vous utilisez une
except:
clause nue , vous pourriez finir par attraper des exceptions autres que celles que vous prévoyez d'attraper - cela peut masquer des bogues ou rendre plus difficile le débogage des programmes lorsqu'ils ne font pas ce que vous attendez.Par exemple, si vous insérez une ligne dans une base de données, vous souhaiterez peut-être intercepter une exception indiquant que la ligne existe déjà, afin de pouvoir effectuer une mise à jour.
Si vous spécifiez un bare
except:
, vous attraperez également une erreur de socket indiquant que le serveur de base de données est tombé. Il est préférable de n'attraper que les exceptions que vous savez gérer - il est souvent préférable que le programme échoue au point de l'exception que de continuer mais se comporte de manière étrange et inattendue.Un cas où vous voudrez peut-être utiliser un bare
except:
est au niveau supérieur d'un programme dont vous devez toujours être en cours d'exécution, comme un serveur réseau. Mais alors, vous devez faire très attention à enregistrer les exceptions, sinon il sera impossible de déterminer ce qui ne va pas. Fondamentalement, il ne devrait y avoir au plus qu'un seul endroit dans un programme qui fait cela.Un corollaire à tout cela est que votre code ne devrait jamais faire
raise Exception('some message')
car il oblige le code client à utiliserexcept:
(ouexcept Exception:
qui est presque aussi mauvais). Vous devez définir une exception spécifique au problème que vous souhaitez signaler (peut-être héritant d'une sous-classe d'exceptions intégrée commeValueError
ouTypeError
). Ou vous devez lever une exception intégrée spécifique. Cela permet aux utilisateurs de votre code d'être prudents en n'attrapant que les exceptions qu'ils souhaitent gérer.la source
except:
attrape également (parmi beaucoup d'autres choses)NameError
etAttributeError
, donc, si vous avez mal orthographié quelque chose dans letry
bloc (par exemple, votre fonction "insert" est en fait appeléeinsert_one
parce que quelqu'un n'a pas accordé autant d'importance à la cohérence qu'il le devrait), il essaie toujours silencieusementupdate()
.main()
)?except Exception:
attraperaNameError
etAttributeError
aussi. Ce qui rend nuexcept:
si mauvais, c'est qu'il attrape des trucs qui n'ont rien à faire, par exempleSystemExit
(soulevé lorsque vous appelezexit
ousys.exit
, et maintenant vous avez empêché une sortie prévue) etKeyboardInterrupt
(encore une fois, si l'utilisateur frappeCtrl-C
, vous ne voulez probablement pas continuer à courir juste pour les contrarier). Seul ce dernier a vraiment un sens à attraper, et il devrait être pris explicitement. Au moinsexcept Exception:
laisse ces deux se propager normalement.Vous ne devez pas ignorer les conseils que vous donne l'interprète.
À partir du guide de style PEP-8 pour Python:
la source
except BaseException
ne veut pas dire la même chose queexcept
: en Python 2; dans Python 2, vous pouvez générer des classes à l'ancienne comme exceptions, qui n'héritent pas deBaseException
.Pas spécifique à Python ceci.
Le but des exceptions est de traiter le problème aussi près que possible de son origine.
Vous gardez donc le code qui pourrait dans des circonstances exceptionnelles déclencher le problème et la résolution "à côté" l'un de l'autre.
Le fait est que vous ne pouvez pas connaître toutes les exceptions qui pourraient être levées par un morceau de code. Tout ce que vous pouvez savoir, c'est que s'il s'agit d'une exception, par exemple un fichier non trouvé, vous pouvez la piéger et inviter l'utilisateur à en obtenir une qui exécute ou annuler la fonction.
Si vous mettez try catch round that, quel que soit le problème qu'il y avait dans votre routine de fichiers (lecture seule, autorisations, UAC, pas vraiment un pdf, etc.), tout le monde tombera dans votre fichier non trouvé catch, et votre utilisateur crie "mais il est là, ce code est de la merde"
Maintenant, il y a quelques situations où vous pourriez tout attraper, mais elles devraient être choisies consciemment.
Ils sont catch, annulez une action locale (comme créer ou verrouiller une ressource, (ouvrir un fichier sur le disque pour écrire par exemple), puis vous relancez l'exception, à traiter à un niveau supérieur)
L'autre vous, c'est que vous ne vous souciez pas de la raison pour laquelle cela a mal tourné. L'impression par exemple. Vous pourriez avoir un hic, pour dire qu'il y a un problème avec votre imprimante, veuillez le régler et ne pas tuer l'application à cause de cela. Si votre code exécutait une série de tâches séparées en utilisant une sorte de calendrier, vous ne voudriez pas que le tout meure, car l'une des tâches a échoué.
Remarque Si vous faites ce qui précède, je ne peux pas recommander une sorte de journalisation des exceptions, par exemple essayez la fin du journal de capture, assez fortement.
la source
Vous attraperez également par exemple Control-C avec cela, alors ne le faites pas à moins que vous ne le "jetiez" à nouveau. Cependant, dans ce cas, vous devriez plutôt utiliser "enfin".
la source
Toujours préciser le type d'exception, il existe de nombreux types que vous ne voulez pas attraper, comme
SyntaxError
,KeyboardInterrupt
,MemoryError
etc.la source
except Exception:
éviter les types ci-dessus que nous ne voulons pas attraper?except Exception
c'est bien.except Exception
attrapeSyntaxError
etMemoryError
parce que c'est leur classe de base.KeyboardInterrupt
,SystemExit
(soulevées parsys.exit()
) ne sont pas interceptées (ce sont des sous-classes immédiates de BaseException)Voici les endroits où j'utilise sauf sans type
C'est la principale utilisation dans mon code pour les exceptions non vérifiées
J'ajoute toujours ceci, pour que le code de production ne déborde pas de stacktraces
J'ai deux façons de le faire:
Je préfère cela, je trouve plus facile de détecter quelles exceptions auraient dû être capturées correctement: je "vois" mieux le problème lorsqu'une exception de niveau inférieur est enregistrée par un niveau supérieur
Certains collègues préfèrent cette méthode, car elle conserve les exceptions de niveau inférieur dans les fonctions de niveau inférieur, auxquelles elles «appartiennent».
la source
Essaye ça:
J'ai obtenu la réponse de ce lien, si quelqu'un d'autre rencontre ce problème Vérifiez-le
la source