¿Cómo evitar errores en arcpy para / while loop?

10

Tengo una útil herramienta de script que recorre un espacio de trabajo y renombra y copia archivos de forma en un conjunto de datos de características. Sin embargo, si hay un archivo de forma dañado en algún lugar del espacio de trabajo, el script falla y detiene el procesamiento.

¿Cómo manejas errores como este? ¿Hay alguna manera de imprimir el archivo de error y continuar procesando el siguiente archivo de forma en el ciclo for hasta su finalización?

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

Respuestas:

15

Intenta buscar en Google "Python en error resume luego" o similar. Esto devuelve varios éxitos, incluido este de StackOverflow :

Si sabe qué declaraciones pueden fallar y cómo pueden fallar, entonces puede usar el manejo de excepciones para limpiar específicamente los problemas que pueden ocurrir con un bloque particular de declaraciones antes de pasar a la siguiente sección.

1) Una opción puede ser poner un try...exceptbloque alrededor de la línea que sospecha que causará el problema, es decir, la herramienta CopyFeatures.

2) Vea también la referencia de Python sobre errores , específicamente la sección 8.3. Una vez que tenga una referencia a "e", podrá determinar su tipo de excepción y manejarla según sea necesario.

Por ejemplo, esta pregunta de StackOverflow contiene un flujo de trabajo similar al tuyo:

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"

En su caso, en lugar de "IndexError" usaría lo que haya determinado que es el tipo de excepción para un archivo de forma corrupto

Stephen Lead
fuente
1
También puede intentar agregar su nombre shp a la lista de errores en la sección excepto. Define tu ie. ErrLst = [] antes del bucle FOR y en la línea de sección excepto antes de CONTINUAR do ErrLst.append (shp). Al final del programa, haga-- para l en ErrLst: print >> file.txt, l. Esto debería imprimir su lista para archivar. No lo probé pero debería funcionar.
Tomek
Gracias Stephen, el bloque try / except-continue hará el truco.
Aaron
7

Como Stephen ya dijo, puede incluir la herramienta CopyFeatures en otro intento ... excepto Block.

Si la herramienta falla con un Shapefile específico, puede registrar el mensaje de la herramienta en alguna parte (siempre lo imprimo en STDOUT y canalizo las salidas a un archivo de registro cuando ejecuto el script).

Lo que tengo que agregar es: en el Bloque Excepto al lado de la Excepción, también debe imprimir los mensajes de error que produjo la Herramienta. No tiene acceso a los mensajes de la herramienta por la excepción (como debería ser seguro) sino desde el objeto arcpy llamando

arcpy.getmessages(messageCount - 1)

Consulte http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 cómo llamarlo y cómo obtener los últimos mensajes que posiblemente estén relacionados con el error específico de Shapefile.

Después de registrar esto, simplemente deja que el script continúe con los otros archivos de forma

Jürgen Zornig
fuente