Réponses:
À partir d'exemples ArcPy , il semble que ce sys.exit()
soit la bonne façon de terminer un script plus tôt.
La documentation Python note que sys.exit()
:
est implémenté en levant l'exception SystemExit, donc les actions de nettoyage spécifiées par les clauses finally des instructions try sont honorées, et il est possible d'intercepter la tentative de sortie à un niveau externe.
Le moyen le plus simple de résoudre ce problème consiste à encapsuler votre script dans un gestionnaire d'exceptions:
import sys
import arcpy
try:
#do stuff
sys.exit(0)
except SystemExit:
pass
Cependant, cela n'est pas particulièrement élégant et nécessite une restructuration de l'ensemble de votre projet, sans parler d'un autre niveau d'indentation. De plus, dans le cas peu probable où une autre partie de votre code déclenche une SystemExit
exception que vous ne sauriez jamais à ce sujet ... Une autre solution inélégante mais peut-être préférable consiste à encapsuler les appels à sys.exit () dans une autre fonction:
import sys
import arcpy
def finish(arg=None):
try:
sys.exit(arg)
except SystemExit:
pass
#do stuff
finish()
Maintenant , vous pouvez appeler finish()
, finish(1)
ou finish('Error message')
tout comme vous vous attendez à pouvoir appeler sys.exit ().
Bien sûr, nous pourrions vouloir utiliser notre approche de l'alimentation d'exception dans d'autres circonstances, et comme il s'agit de Python, nous pouvons généraliser et créer un décorateur utile et polyvalent:
import sys
import arcpy
def eat_exception(fn, exception):
def safe(*v, **k):
try:
fn(*v, **k)
except exception:
pass
return safe
finish = eat_exception(sys.exit, SystemExit)
#do stuff
finish()