Mengakhiri skrip Python di ArcMap?

17

Saya sudah mencoba sys.exit, tetapi sepertinya tidak berhasil di ArcMap 10.

Adakah yang tahu bagaimana melakukannya?

Penyamak
sumber

Jawaban:

16

Dari contoh ArcPy , sepertinya sys.exit()ini adalah cara yang benar untuk mengakhiri skrip lebih awal.

The Python dokumentasi catatan yang sys.exit():

diimplementasikan dengan meningkatkan pengecualian SystemExit, sehingga tindakan pembersihan yang ditentukan oleh klausa terakhir dari pernyataan try dihormati, dan dimungkinkan untuk mencegat upaya keluar di tingkat luar.

Cara mudah untuk mengatasinya adalah dengan membungkus skrip Anda dalam penangan pengecualian:

import sys
import arcpy

try:
    #do stuff
    sys.exit(0)
except SystemExit:
    pass

Namun, ini tidak terlalu elegan dan membutuhkan restrukturisasi seluruh proyek Anda, belum lagi tingkat lekukan lain. Plus, dalam situasi yang tidak mungkin bahwa bagian lain dari kode Anda menimbulkan SystemExitpengecualian Anda tidak akan pernah tahu tentang hal itu ... Solusi lain yang tidak disukai tapi mungkin lebih baik adalah dengan membungkus panggilan ke sys.exit () dalam fungsi lain:

import sys
import arcpy

def finish(arg=None):
    try:
        sys.exit(arg)
    except SystemExit:
        pass

#do stuff
finish()

Sekarang Anda dapat menelepon finish(),, finish(1)atau finish('Error message')seperti yang Anda harapkan untuk dapat memanggil sys.exit ().

Tentu saja, kami mungkin ingin menggunakan pendekatan makan pengecualian kami dalam keadaan lain, dan karena ini adalah Python, kami dapat menggeneralisasi dan membuat dekorator serbaguna yang berguna:

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()
fmark
sumber