Python 2.7.5 (default, Feb 26 2014, 13:43:17)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> try:
... sys.exit()
... except:
... print "in except"
...
in except
>>> try:
... sys.exit(0)
... except:
... print "in except"
...
in except
>>> try:
... sys.exit(1)
... except:
... print "in except"
...
in except
Pourquoi ne suis-je pas en mesure de déclencher sys.exit () dans try, des suggestions ... !!!
Le code affiché ici contient tous les détails de la version.
J'ai essayé toutes les façons possibles de le déclencher, mais j'ai échoué. Il arrive au bloc "sauf".
Merci d'avance..
sys.exit()
lève une exception, à savoir SystemExit
. C'est pourquoi vous atterrissez dans le bloc except
-.
Voir cet exemple:
import sys
try:
sys.exit()
except:
print(sys.exc_info()[0])
Cela vous donne:
<type 'exceptions.SystemExit'>
Bien que je ne puisse pas imaginer que l'on ait une raison pratique de le faire, vous pouvez utiliser cette construction:
import sys
try:
sys.exit() # this always raises SystemExit
except SystemExit:
print("sys.exit() worked as expected")
except:
print("Something went horribly wrong") # some other exception got raised
basé sur python wiki:
Puisque exit () finalement "seulement" lève une exception, il ne quittera le processus que lorsqu'il sera appelé depuis le thread principal, et l'exception n'est pas interceptée.
Et:
La fonction
exit
n'est pas appelée lorsque le programme est tué par un signal, lorsqu'une erreur interne fatale Python est détectée, ou lorsqueos._exit()
est appelée.
Par conséquent, si vous utilisez sys.exit()
dans un bloc try
python après avoir levé l'exception SystemExit
python = refuse de terminer la fonctionnalité de exits
et exécute le bloc exception
.
Maintenant, du point de vue de la programmation, vous n'avez essentiellement pas besoin de mettre quelque chose que vous savez déclenche définitivement une exception dans un bloc try
. Au lieu de cela, vous pouvez soit lever manuellement une exception SystemExit
soit comme une approche plus Pythonic si vous ne voulez pas perdre les fonctionnalités respectives de sys.exit()
comme passer un argument optionnel à son constructeur, vous pouvez appeler sys.exit()
dans un bloc finally
, else
ou même except
.
Méthode 1 (non recommandée)
try:
# do stuff
except some_particular_exception:
# handle this exception and then if you want
# do raise SystemExit
else:
# do stuff and/or do raise SystemExit
finally:
# do stuff and/or do raise SystemExit
Méthode 2 (recommandée):
try:
# do stuff
except some_particular_exception:
# handle this exception and then if you want
# do sys.exit(stat_code)
else:
# do stuff and/or do sys.exit(stat_code)
finally:
# do stuff and/or do sys.exit(stat_code)