Odpowiedzi:
Z przykładów ArcPy wydaje się, że sys.exit()
jest to właściwy sposób na wcześniejsze zakończenie skryptu.
Dokumentacja Pythona zauważa, że sys.exit()
:
jest implementowany przez zgłoszenie wyjątku SystemExit, więc działania czyszczące określone w klauzulach instrukcji try są wreszcie honorowane i możliwe jest przechwycenie próby wyjścia na poziomie zewnętrznym.
Najłatwiejszym sposobem na poradzenie sobie z tym jest zawinięcie skryptu w moduł obsługi wyjątków:
import sys
import arcpy
try:
#do stuff
sys.exit(0)
except SystemExit:
pass
Nie jest to jednak szczególnie eleganckie i wymaga restrukturyzacji całego projektu, nie wspominając już o innym poziomie wcięcia. Ponadto w mało prawdopodobnej sytuacji, gdy inna część kodu wywołuje SystemExit
wyjątek, o którym nigdy się nie dowiesz ... Kolejnym nieelegacyjnym, ale być może lepszym rozwiązaniem jest zawinięcie wywołań funkcji sys.exit () w innej funkcji:
import sys
import arcpy
def finish(arg=None):
try:
sys.exit(arg)
except SystemExit:
pass
#do stuff
finish()
Teraz możesz wywoływać finish()
, finish(1)
lub finish('Error message')
tak jak oczekujesz, że będziesz mógł wywołać sys.exit ().
Oczywiście możemy chcieć zastosować nasze wyjątkowe podejście do jedzenia w innych okolicznościach, a ponieważ jest to Python, możemy uogólnić i stworzyć użyteczny, uniwersalny dekorator:
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()