Bagaimana cara memotong kesalahan di arcpy untuk / while loop?


10

Saya memiliki alat skrip berguna yang loop melalui ruang kerja dan mengubah nama dan menyalin shapefile ke dataset fitur. Namun, jika ada shapefile rusak di suatu tempat di ruang kerja skrip gagal dan berhenti diproses.

Bagaimana Anda menangani kesalahan seperti ini? Apakah ada cara untuk mencetak file kesalahan dan melanjutkan memproses shapefile berikutnya dalam for loop sampai selesai?

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

Jawaban:


15

Coba Googling untuk "python on error resume berikutnya" atau serupa. Ini mengembalikan sejumlah klik termasuk yang ini dari StackOverflow :

Jika Anda tahu pernyataan mana yang mungkin gagal, dan bagaimana mereka gagal, maka Anda dapat menggunakan penanganan pengecualian untuk secara khusus membersihkan masalah yang mungkin terjadi dengan blok pernyataan tertentu sebelum pindah ke bagian berikutnya.

1) Opsi mungkin untuk meletakkan try...exceptblok di sekitar garis yang Anda curigai akan menyebabkan masalah, yaitu alat CopyFeatures.

2) Lihat juga referensi Python tentang kesalahan , khususnya bagian 8.3. Setelah Anda memiliki referensi ke "e" Anda mungkin dapat menentukan jenis pengecualiannya dan menanganinya sesuai kebutuhan.

Misalnya pertanyaan StackOverflow ini berisi alur kerja yang serupa dengan Anda:

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"

Dalam kasus Anda, sebagai pengganti "IndexError" Anda akan menggunakan apa pun yang Anda tentukan jenis pengecualian untuk sebuah shapefile rusak


1
Anda juga dapat mencoba menambahkan nama shp Anda ke daftar kesalahan di bagian pengecualian. Tentukan mis Anda. ErrLst = [] sebelum loop FOR dan di baris bagian kecuali sebelum LANJUTKAN lakukan ErrLst.append (shp). Pada akhir program do-- for l di ErrLst: print >> file.txt, l. Ini akan mencetak daftar Anda ke file. Saya tidak mengujinya tetapi harus bekerja.
Tomek

Terima kasih Stephen, coba / kecuali-terus blok akan melakukan trik.
Aaron

7

Seperti yang sudah dikatakan Stephen, Anda dapat menyertakan Alat CopyFeatures di percobaan lain ... kecuali Blokir.

Jika alat gagal dengan Shapefile tertentu, Anda dapat mencatat Pesan Alat di suatu tempat (saya selalu mencetaknya di STDOUT dan menyalurkan output ke logfile ketika saya menjalankan skrip).

Yang harus saya tambahkan adalah: Di Blok Kecuali di samping Pengecualian Anda juga harus mencetak pesan kesalahan yang dihasilkan Alat itu sendiri. Anda tidak mendapatkan akses ke pesan Alat dengan Pengecualian (seperti yang seharusnya sudah pasti) tetapi dari objek arcpy dengan menelepon

arcpy.getmessages(messageCount - 1)

Lihat http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 cara memanggilnya dan cara mendapatkan pesan terakhir yang mungkin terkait dengan Kesalahan Shapefile spesifik.

Setelah masuk ini, Anda cukup membiarkan skrip melanjutkan dengan shapefile lainnya

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.