92 votes

Utilisation de sys.exit ou SystemExit ; quand utiliser quoi ?

Certains programmeurs utilisent sys.exit d'autres utilisent SystemExit .

  1. Quelle est la différence ?
  2. Quand dois-je utiliser SystemExit o sys.exit à l'intérieur d'une fonction ?

Ejemplo:

ref = osgeo.ogr.Open(reference)
if ref is None:
    raise SystemExit('Unable to open %s' % reference)

ou :

ref = osgeo.ogr.Open(reference)
if ref is None:
    print('Unable to open %s' % reference)
    sys.exit(-1)

45voto

RichieHindle Points 98544

Il n'y a pas de différence pratique, mais il y a une autre différence dans votre code d'exemple - print est envoyé à la sortie standard, mais le texte de l'exception est envoyé à l'erreur standard (ce qui est probablement ce que vous voulez).

42voto

larsmans Points 167484

sys.exit(s) est juste un raccourci pour raise SystemExit(s) comme décrit dans la docstring du premier ; essayez help(sys.exit) . Ainsi, au lieu de l'un ou l'autre de vos programmes d'exemple, vous pouvez faire

sys.exit('Unable to open %s' % reference)

32voto

Perkins Points 616

Il existe 3 fonctions de sortie, en plus de l'élévation SystemExit .

L'élément sous-jacent est os._exit qui nécessite 1 argument int, et sort immédiatement sans nettoyage. Il est peu probable que vous souhaitiez toucher à cette fonction, mais elle existe.

sys.exit est défini dans sysmodule.c et exécute simplement PyErr_SetObject(PyExc_SystemExit, exit_code); ce qui revient en fait à augmenter directement SystemExit . Dans les moindres détails, l'augmentation SystemExit est probablement plus rapide, puisque sys.exit nécessite une LOAD_ATTR y CALL_FUNCTION vs RAISE_VARARGS opcalls. En outre, raise SystemExit produit un bytecode légèrement plus petit (4 octets de moins), (1 octet de plus si vous utilisez from sys import exit depuis sys.exit est censé renvoyer None, ce qui implique l'ajout d'un élément supplémentaire POP_TOP ).

La dernière fonction de sortie est définie dans site.py et alias exit o quit dans la REPL. Il s'agit en fait d'une instance de la classe Quitter (afin qu'elle puisse avoir un __repr__ Il s'agit donc probablement de l'opération la plus lente. De plus, il ferme sys.stdin avant de lever SystemExit Il est donc recommandé de l'utiliser uniquement dans le REPL.

Quant à la manière dont les SystemExit est géré, il finit par amener la VM à appeler os._exit, mais avant cela, il fait un peu de nettoyage. Il exécute également atexit._run_exitfuncs() qui exécute toutes les fonctions de rappel enregistrées par l'intermédiaire de la fonction atexit module. Appel os._exit contourne directement le atexit pas.

15voto

Jon Clements Points 51556

Personnellement, je préfère qu'au moins SystemExit est levée (ou, mieux encore, une exception personnalisée plus significative et bien documentée), puis rattrapée aussi près que possible de la fonction "principale", qui peut alors avoir une dernière chance de considérer qu'il s'agit d'une sortie valide ou non. Les bibliothèques/fonctions profondément intégrées qui ont sys.exit est tout simplement désagréable du point de vue de la conception. (En règle générale, la sortie doit se faire "le plus haut possible").

6voto

piokuc Points 11938

Selon la documentation sys.exit(s) fait effectivement raise SystemExit(s) Il s'agit donc à peu près de la même chose.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X