Si vous poser des questions sur la langue construit:
- Utilisez
try: except: else:
il assure que vous ne prendre de mauvaises exceptions.
- Réfléchissez bien avant attrapez
BaseException
, Exception
ou utiliser nu except:
que vous pouvez attraper easly à beaucoup:
- vos fautes d'orthographe - NameError, ImportError
- tentative de l'utilisateur de mettre fin à votre programme. KeyboardInterrupt, SystemExit
- erreurs qui indique la mise en œuvre incomplète: NotImplementedError
- Si vous décidez d'intercepter des exceptions génériques les journaux à l'aide
log.exception('your message', e)
- Gardez à l'esprit que les exceptions en Python sont également utilisés pour le contrôle des flux réguliers (comme
StopIteration
exception)
- Utilisez la nouvelle syntaxe:
except MyException as myex:
au lieu de except MyException, myex:
. Il est plus facile à lire pour les développeurs Python non expérimentés.
Voici un exemple qui attire NameError:
try:
this_doesn_not_exisit();
except Exception: #Don't do that!
pass
print "But this line is still printed"
Réponse à la question éditée:
- En ce qui concerne les fichiers si vous lisez des fichiers de texte, utilisez toujours codecs.open au lieu d'ouvrir pour vous assurer que vous pouvez stocker en toute sécurité des chaînes Unicode.
- En ce qui concerne le
__init__
et l'état de l'objet. __init__
est un initialiseur de sorte que l'objet existe déjà lorsque __init__
est appelée. Si vous déclenchez une exception, le flux sera interrompu et l'objet ne sera stocké dans aucune variable, il sera donc collecté. Au moins c'est ma compréhension. Pensez que MyObject() est juste une fonction qui renvoie une valeur si vous relancez une exception vous ne renvoyez rien, le flux est interrompu et la valeur que vous avez assignée n'est pas modifiée.
Check this out:
>>> def throw(): raise Exception()
...
>>> a=1
>>> a=throw()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in throw
Exception
>>> a
1
Voici un exemple pour prouver que l'objet est créé, même si vous élevez exception __init__
. Je n'ai pas pu publier ce fragment dans les commentaires à @ S. Lott réponse:
>>> global_collection=[]
>>> class Partial(object):
... def __init__(self):
... self.test="test"
... global_collection.append(self)
... raise Exception()
...
>>> x=Partial()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 5, in __init__
Exception
>>> global_collection
[<__main__.Partial object at 0xb74f8f6c>]
>>> global_collection[0].test
'test'
MISE À JOUR: commentaires formulés faites par: McGuire @ Paul, @martineau, @aaronasterling
Euh, de quoi parlez-vous? La sécurité de quoi? Cela semble être un sujet assez vaste. Quelle est votre question? – Falmarri
L'objet existe déjà avant que '__init __()' soit appelé - c'est ce que le premier argument, habituellement appelé 'self', est - mais il n'est pas encore initialisé. Si une exception se produit au cours de ce processus, il se peut qu'il ne soit que partiellement ou même complètement non initialisé, selon la façon dont l'exception est traitée et par quoi. – martineau
Voici ce que je voulais dire à propos d'un objet qui n'est pas initialisé correctement en fonction de la façon dont une exception se produisant dans la méthode '__init __()' a été gérée:! [Exemple de code] (http://dl.dropbox.com/u/5508445/stackoverflow /__init__exception.png). – martineau