Come bypassare gli errori in arcpy per / while loop?


10

Ho un utile strumento di script che scorre in uno spazio di lavoro e rinomina e copia gli shapefile in un set di dati di funzionalità. Tuttavia, se esiste un file di forma danneggiato da qualche parte nell'area di lavoro, lo script non riesce e interrompe l'elaborazione.

Come gestite errori come questo? C'è un modo per stampare il file di errore e continuare l'elaborazione del prossimo file di forma nel ciclo for fino al completamento?

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

Risposte:


15

Prova a cercare su Google "Python in errore riprendi successivo" o simile. Ciò restituisce un numero di hit incluso questo da StackOverflow :

Se sai quali istruzioni potrebbero non riuscire e come potrebbero non riuscire, puoi utilizzare la gestione delle eccezioni per ripulire specificamente i problemi che potrebbero verificarsi con un particolare blocco di istruzioni prima di passare alla sezione successiva.

1) Un'opzione potrebbe essere quella di mettere un try...exceptblocco attorno alla linea che sospetti causerà il problema, vale a dire lo strumento CopyFeatures.

2) Vedi anche il riferimento Python sugli errori , in particolare la sezione 8.3. Una volta che hai un riferimento a "e" potresti essere in grado di determinare il suo tipo di eccezione e gestirlo come richiesto.

Ad esempio, questa domanda StackOverflow contiene un flusso di lavoro simile al tuo:

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"

Nel tuo caso, al posto di "IndexError" useresti qualunque cosa tu abbia determinato il tipo di eccezione per un file di forma corrotto


1
Puoi anche provare ad aggiungere il tuo nome shp all'elenco degli errori nella sezione tranne. Definisci il tuo ie. ErrLst = [] prima del ciclo FOR e nella riga di sezione tranne prima di CONTINUE fare ErrLst.append (shp). Alla fine del programma do-- per l in ErrLst: stampa >> file.txt, l. Questo dovrebbe stampare la tua lista su file. Non l'ho provato ma dovrebbe funzionare.
Tomek,

Grazie Stephen, il blocco try / tranne-continue farà il trucco.
Aaron

7

Come già detto da Stephen, puoi racchiudere lo strumento CopyFeatures in un altro tentativo ... tranne Block.

Se lo strumento non funziona con uno Shapefile specifico, è possibile registrare il messaggio dello strumento da qualche parte (lo stampo sempre su STDOUT e installo gli output in un file di registro quando eseguo lo script).

Quello che devo aggiungere è: Nel blocco tranne accanto all'eccezione devi anche stampare i messaggi di errore prodotti dallo strumento stesso. Non si ottiene l'accesso ai messaggi dello strumento dall'eccezione (come dovrebbe essere sicuro) ma dall'oggetto arcpy chiamando

arcpy.getmessages(messageCount - 1)

Vedi http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 come chiamarlo e come ottenere gli ultimi messaggi eventualmente correlati allo specifico Shapefile Error.

Dopo averlo registrato, lasci semplicemente che lo script continui con gli altri shapefile

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.