Відповіді:
З прикладів ArcPy , схоже, sys.exit()це правильний спосіб дострокового припинення сценарію.
Документація Python зазначає, що sys.exit():
реалізується шляхом підняття винятку SystemExit, тому дії очищення, визначені остаточно застереженнями випробувань, виконуються, і можливо перехопити спробу виходу на зовнішній рівень.
Найпростіший спосіб вирішити це - перетворити сценарій на обробку винятків:
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()