Відповіді:
З прикладів 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()