web-dev-qa-db-fra.com

python sys.exit ne fonctionne pas dans try

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..

19
onlyvinish

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
18
tamasgal

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 lorsque os._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)
8
Kasramvd