10 votos

¿Cómo evitar los errores en el bucle arcpy for/while?

Tengo una herramienta muy útil script que recorre un espacio de trabajo y renombra y copia archivos de forma a un conjunto de datos de características. Sin embargo, si hay un archivo de formas corrupto en algún lugar del espacio de trabajo, la herramienta script falla y deja de procesar.

¿Cómo se manejan errores como éste? ¿Hay alguna manera de imprimir el archivo de errores y continuar procesando el siguiente archivo de forma en el bucle de for para completarlo?

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

15voto

Harshad Kshirsagar Puntos 76

Intenta buscar en Google "python on error resume next" o algo similar. Esto devuelve una serie de resultados, incluyendo este de StackOverflow :

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

1) Una opción puede ser poner un try...except bloque alrededor de la línea que sospechas que causará el problema, a saber, la herramienta CopyFeatures.

2) Véase también la referencia a Python en 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, este StackOverflow pregunta contiene un flujo de trabajo similar al suyo:

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 determinara el tipo de excepción para un shapefile corrupto.

1 votos

También puede intentar añadir su nombre shp a la lista de errores en la sección except. Defina su ie. ErrLst = [] antes del bucle FOR y en la línea de la sección except antes de CONTINUE do ErrLst.append(shp). Al final del programa haz-- for l in ErrLst: print >> fichero.txt, l . Esto debería imprimir tu lista en el archivo. No lo he probado pero debería funcionar.

0 votos

Gracias Stephen, el bloque try/except-continue funcionará.

7voto

Jürgen Zornig Puntos 1477

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

Si la herramienta falla con un Shapefile específico puedes registrar el Mensaje de la Herramienta en algún lugar (siempre lo imprimo en STDOUT y conduzco las salidas a un archivo de registro cuando ejecuto el script).

Lo que tengo que añadir es: En el Bloque de Excepción junto a la Excepción también tienes que imprimir los mensajes de error que la propia Herramienta produjo. No se accede a los mensajes de la Herramienta por la Excepción (como debería ser seguro) sino desde el Objeto arcpy llamando a

arcpy.getmessages(messageCount - 1)

Ver 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 formas.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X