Comment contourner les erreurs dans la boucle arcpy for / while?

10

J'ai un outil de script pratique qui parcourt un espace de travail et renomme et copie les fichiers de formes dans un jeu de données d'entité. Cependant, s'il existe un fichier de formes corrompu quelque part dans l'espace de travail, le script échoue et arrête le traitement.

Comment gérez-vous des erreurs comme celle-ci? Existe-t-il un moyen d'imprimer le fichier d'erreur et de poursuivre le traitement du fichier de formes suivant dans la boucle for jusqu'à la fin?

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
la source

Réponses:

15

Essayez de googler pour "python en cas de reprise d'erreur suivante" ou similaire. Cela renvoie un certain nombre de hits, dont celui-ci de StackOverflow :

Si vous savez quelles instructions peuvent échouer et comment elles peuvent échouer, vous pouvez utiliser la gestion des exceptions pour nettoyer spécifiquement les problèmes qui peuvent survenir avec un bloc particulier d'instructions avant de passer à la section suivante.

1) Une option peut être de placer un try...exceptbloc autour de la ligne que vous pensez provoquer le problème, à savoir l'outil CopyFeatures.

2) Voir également la référence Python sur les erreurs , en particulier la section 8.3. Une fois que vous avez une référence à «e», vous pouvez déterminer son type d'exception et le gérer selon les besoins.

Par exemple, cette question StackOverflow contient un flux de travail similaire au vôtre:

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"

Dans votre cas, au lieu de "IndexError", vous utiliseriez tout ce que vous avez déterminé comme étant le type d'exception pour un fichier de formes corrompu

Stephen Lead
la source
1
Vous pouvez également essayer d'ajouter votre nom shp à la liste d'erreurs dans la section except. Définissez votre ie. ErrLst = [] avant la boucle FOR et dans la ligne de section exceptée avant CONTINUER, faites ErrLst.append (shp). À la fin du programme, faites pour l dans ErrLst: print >> file.txt, l. Cela devrait imprimer votre liste dans un fichier. Je ne l'ai pas testé mais devrait fonctionner.
Tomek
Merci Stephen, le bloc try / except-continue fera l'affaire.
Aaron
7

Comme Stephen l'a déjà dit, vous pouvez inclure l'outil CopyFeatures dans un autre essai ... sauf Block.

Si l'outil échoue avec un fichier de formes spécifique, vous pouvez enregistrer le message d'outil quelque part (je l'imprime toujours sur STDOUT et je dirige les sorties vers un fichier journal lorsque j'exécute le script).

Ce que je dois ajouter est le suivant: dans le bloc sauf à côté de l'exception, vous devez également imprimer les messages d'erreur que l'outil lui-même a produits. Vous n'avez pas accès aux messages de l'outil par l'exception (comme cela devrait être sûr) mais à partir de l'objet arcpy en appelant

arcpy.getmessages(messageCount - 1)

Voir http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 comment l'appeler et comment obtenir les derniers messages éventuellement liés à l'erreur Shapefile spécifique.

Après avoir enregistré cela, vous laissez simplement le script continuer avec les autres fichiers de formes

Jürgen Zornig
la source