Ответы:
Из примеров ArcPy кажется, что sys.exit()
это правильный способ досрочного завершения скрипта.
Документация Python отмечает, что sys.exit()
:
реализуется путем вызова исключения SystemExit, поэтому действия по очистке, указанные в предложениях finally операторов try, соблюдаются, и можно перехватить попытку выхода на внешнем уровне.
Самый простой способ справиться с этим - обернуть ваш скрипт в обработчик исключений:
import sys
import arcpy
try:
#do stuff
sys.exit(0)
except SystemExit:
pass
Однако это не особенно элегантно и требует реструктуризации всего вашего проекта, не говоря уже о другом уровне отступов. Кроме того, в маловероятной ситуации, когда другая часть вашего кода вызывает SystemExit
исключение, о котором вы никогда не узнаете ... Еще одно не элегантное, но, возможно, предпочтительное решение - заключить вызовы sys.exit () в другую функцию:
import sys
import arcpy
def finish(arg=None):
try:
sys.exit(arg)
except SystemExit:
pass
#do stuff
finish()
Теперь вы можете позвонить finish()
, finish(1)
или finish('Error message')
так же , как вы ожидаете , чтобы быть в состоянии назвать sys.exit ().
Конечно, мы можем захотеть использовать наш подход к использованию исключений в других обстоятельствах, и, поскольку это Python, мы можем обобщить и сделать полезный многоцелевой декоратор:
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()