Làm thế nào để bỏ qua lỗi trong arcpy for / while loop?


10

Tôi có một công cụ kịch bản tiện dụng lặp lại trong không gian làm việc, đổi tên và sao chép các shapefiles thành tập dữ liệu tính năng. Tuy nhiên, nếu có một shapefile bị hỏng ở đâu đó trong không gian làm việc thì script bị lỗi và dừng xử lý.

Làm thế nào để bạn xử lý các lỗi như thế này? Có cách nào để in tệp lỗi và tiếp tục xử lý shapefile tiếp theo trong vòng lặp for để hoàn thành không?

import arcpy
from arcpy import env

# Allow overwriting of output  
env.overwriteOutput = True

# Parameters  
env.workspace = arcpy.GetParameterAsText(0) 
state = arcpy.GetParameterAsText(1)
gdb = arcpy.GetParameterAsText(2)

# Get a list of shapefiles in folder  
fcs = arcpy.ListFeatureClasses() 

# Find the total count of shapefiles in list  
fcCount = len(fcs) 

# Set the progressor 
arcpy.SetProgressor("step", "Copying shapefiles to geodatabase...", 0,fcCount, 1) 

# For each shapefile, copy to a file geodatabase

try:
    for shp in fcs: 


        # Define name for the output points 
        fc = str(state + shp[0:9])

        # Update the progressor label for current shapefile  
        arcpy.SetProgressorLabel("Loading " + shp + "...") 

        # Copy the data  
        arcpy.CopyFeatures_management(shp, str(gdb + "\\" + fc)) 

        # Update the progressor position  
        arcpy.SetProgressorPosition()

except Exception as e:
    print "An error has occurred"
    print e

arcpy.ResetProgressor()

Câu trả lời:


15

Hãy thử Googling cho "python on error next next" hoặc tương tự. Điều này trả về một số lần truy cập bao gồm cả lượt truy cập này từ StackOverflow :

Nếu bạn biết câu lệnh nào có thể thất bại và cách chúng có thể thất bại, thì bạn có thể sử dụng xử lý ngoại lệ để dọn dẹp cụ thể các vấn đề có thể xảy ra với một khối câu lệnh cụ thể trước khi chuyển sang phần tiếp theo.

1) Một tùy chọn có thể là đặt một try...exceptkhối xung quanh dòng mà bạn nghi ngờ sẽ gây ra sự cố, cụ thể là công cụ CopyFeatures.

2) Xem thêm tài liệu tham khảo Python về các lỗi , cụ thể là phần 8.3. Khi bạn có một tham chiếu đến "e", bạn có thể xác định loại ngoại lệ của nó và xử lý nó theo yêu cầu.

Ví dụ: câu hỏi StackOverflow này chứa một quy trình công việc tương tự như của bạn:

for getter in (get_random_foo, get_random_bar):
    try:
        return getter()
    except IndexError:
        continue  # Ignore the exception and try the next type.

raise IndexError, "No foos, no bars"

Trong trường hợp của bạn, thay cho "IndexError", bạn sẽ sử dụng bất cứ điều gì bạn xác định loại ngoại lệ là cho một shapefile bị hỏng


1
Bạn cũng có thể thử thêm tên shp của mình vào danh sách lỗi trong phần ngoại trừ. Xác định nghĩa của bạn. ErrLst = [] trước vòng lặp FOR và trong dòng phần ngoại trừ trước TIẾP TỤC làm ErrLst.append (shp). Vào cuối chương trình làm-- cho l trong ErrLst: print >> file.txt, l. Điều này sẽ in danh sách của bạn để tập tin. Tôi đã không kiểm tra nó nhưng nên làm việc.
Tomek

Cảm ơn Stephen, khối thử / ngoại trừ tiếp tục sẽ thực hiện thủ thuật.
Aaron

7

Như Stephen đã nói, bạn có thể gửi Công cụ CopyFeatures trong một lần thử khác ... ngoại trừ Chặn.

Nếu công cụ thất bại với một Shapefile cụ thể, bạn có thể đăng nhập Thông báo công cụ ở đâu đó (Tôi luôn in nó trên STDOUT và chuyển các kết quả đầu ra thành một logfile khi tôi chạy tập lệnh).

Điều tôi phải thêm là: Trong Khối ngoại trừ bên cạnh Ngoại lệ, bạn cũng phải in các thông báo lỗi do Công cụ tự tạo. Bạn không có quyền truy cập vào các thông báo Công cụ bằng Ngoại lệ (vì chắc chắn là như vậy) nhưng từ Đối tượng phức tạp bằng cách gọi

arcpy.getmessages(messageCount - 1)

Xem http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 cách gọi và cách nhận các tin nhắn cuối cùng có thể liên quan đến Lỗi Shapefile cụ thể.

Sau khi đăng nhập, bạn chỉ cần để tập lệnh tiếp tục với các shapefiles khác

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.