Tự chấm dứt tập lệnh Python trong ArcMap?


17

Tôi đã thử sys.exit, nhưng nó dường như không hoạt động trong ArcMap 10.

Bất cứ ai cũng biết làm thế nào để làm điều đó?

Câu trả lời:


16

Từ các ví dụ của ArcPy , có vẻ như đây sys.exit()là cách chính xác để chấm dứt một kịch bản sớm.

Các tài liệu Python ghi chú rằng sys.exit():

được triển khai bằng cách tăng ngoại lệ SystemExit, do đó, các hành động dọn dẹp được chỉ định bởi các mệnh đề thử cuối cùng được thực hiện và có thể chặn nỗ lực thoát ở cấp độ bên ngoài.

Cách dễ dàng để giải quyết vấn đề này là bọc tập lệnh của bạn trong một trình xử lý ngoại lệ:

import sys
import arcpy

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

Tuy nhiên, điều này không đặc biệt thanh lịch và đòi hỏi phải cấu trúc lại toàn bộ dự án của bạn, chưa kể đến một mức độ thụt lề khác. Ngoài ra, trong trường hợp không chắc là một phần khác trong mã của bạn sẽ đưa ra một SystemExitngoại lệ mà bạn sẽ không bao giờ biết về nó ... Một giải pháp không phù hợp nhưng có lẽ thích hợp hơn là bọc các lệnh gọi đến sys.exit () trong một hàm khác:

import sys
import arcpy

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

#do stuff
finish()

Bây giờ bạn có thể gọi finish(), finish(1)hoặc finish('Error message')giống như bạn mong đợi để có thể gọi sys.exit ().

Tất nhiên, chúng tôi có thể muốn sử dụng phương pháp ăn ngoại lệ của mình trong các trường hợp khác và vì đây là Python, chúng tôi có thể khái quát hóa và tạo ra một công cụ trang trí đa năng, hữu ích:

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()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.