วิธีการหลีกเลี่ยงข้อผิดพลาดใน arcpy สำหรับ / ในขณะที่วง?


10

ฉันมีเครื่องมือสคริปต์ที่ใช้งานง่ายที่วนรอบพื้นที่ทำงานและเปลี่ยนชื่อและคัดลอกรูปร่างไฟล์ไปยังชุดข้อมูลคุณสมบัติ อย่างไรก็ตามหากมีไฟล์รูปร่างที่เสียหายอยู่ในพื้นที่ทำงานสคริปต์จะล้มเหลวและหยุดการประมวลผล

คุณจัดการข้อผิดพลาดเช่นนี้ได้อย่างไร มีวิธีพิมพ์ไฟล์ข้อผิดพลาดและดำเนินการประมวลผล shapefile ถัดไปใน for for loop to complete หรือไม่

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

คำตอบ:


15

ลองใช้ Googling สำหรับ "python เมื่อเกิดข้อผิดพลาดต่อไป" หรือคล้ายกัน สิ่งนี้จะคืนค่าจำนวนครั้งการเข้าชมรวมถึงสิ่งนี้จากStackOverflow :

หากคุณทราบว่าข้อความใดบ้างที่อาจล้มเหลวและวิธีที่ล้มเหลวคุณสามารถใช้การจัดการข้อยกเว้นเพื่อทำความสะอาดปัญหาที่อาจเกิดขึ้นกับกลุ่มข้อความเฉพาะก่อนที่จะย้ายไปยังส่วนถัดไป

1) ตัวเลือกอาจใส่try...exceptบล็อกรอบ ๆ บรรทัดที่คุณสงสัยว่าจะทำให้เกิดปัญหาคือเครื่องมือ CopyFeatures

2) ดูการอ้างอิง Python เกี่ยวกับข้อผิดพลาดโดยเฉพาะในส่วนที่ 8.3 เมื่อคุณมีการอ้างอิงถึง "e" คุณอาจสามารถกำหนดประเภทข้อยกเว้นและจัดการตามที่ต้องการ

เช่นคำถาม StackOverflow มีเวิร์กโฟลว์ที่คล้ายกับของคุณ:

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"

ในกรณีของคุณแทนที่ "IndexError" คุณจะใช้สิ่งที่คุณกำหนดประเภทข้อยกเว้นสำหรับไฟล์รูปร่างที่เสียหาย


1
คุณอาจลองเพิ่มชื่อ shp ของคุณไปยังรายการข้อผิดพลาดในส่วนยกเว้น กำหนดเช่นของคุณ ErrLst = [] ก่อนหน้า FOR FOR และในบรรทัดส่วนยกเว้นก่อนดำเนินการต่อ ErrLst.append (shp) เมื่อสิ้นสุดโปรแกรม - สำหรับ l ใน ErrLst: print >> file.txt, l สิ่งนี้ควรพิมพ์รายการของคุณเป็นไฟล์ ฉันไม่ได้ทดสอบ แต่ควรใช้งานได้
Tomek

ขอบคุณสตีเฟ่นบล็อกลอง / ยกเว้นดำเนินการต่อจะทำเคล็ดลับ
แอรอน

7

ดังที่สตีเฟ่นกล่าวแล้วว่าคุณสามารถใส่เครื่องมือ CopyFeatures ในการลองอื่น ... ยกเว้นบล็อก

หากเครื่องมือล้มเหลวด้วย Shapefile เฉพาะคุณสามารถบันทึกข้อความเครื่องมือที่ไหนสักแห่ง (ฉันมักจะพิมพ์มันใน STDOUT และท่อส่งออกไปยัง logfile เมื่อฉันเรียกใช้สคริปต์)

สิ่งที่ฉันต้องเพิ่มคือ: ในบล็อกยกเว้นข้างข้อยกเว้นคุณต้องพิมพ์ข้อความแสดงข้อผิดพลาดที่ตัวเครื่องมือสร้างขึ้นเอง คุณไม่ได้รับการเข้าถึงข้อความเครื่องมือโดยข้อยกเว้น (ตามที่ควรจะเป็นอย่างแน่นอน) แต่จากวัตถุ arcpy โดยการโทร

arcpy.getmessages(messageCount - 1)

ดูhttp://help.arcgis.com/th/arcgisdesktop/10.0/help/index.html#//000v0000000m000000วิธีการโทรและวิธีรับข้อความล่าสุดซึ่งอาจเกี่ยวข้องกับข้อผิดพลาด Shapefile ที่เฉพาะเจาะจง

หลังจากบันทึกสิ่งนี้คุณเพียงแค่ปล่อยให้สคริปต์ดำเนินการกับรูปร่างอื่น ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.