Thursday 30 July 2015

python - How to bypass errors in arcpy for/while loop?


I have a handy script tool that loops through a workspace and renames and copies shapefiles to a feature dataset. However, if there is a corrupted shapefile somewhere in the workspace the script fails and stops processing.


How do you handle errors such as this? Is there a way to print the error file and continue processing the next shapefile in the for loop to completion?


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

Answer



Try Googling for "python on error resume next" or similar. This returns a number of hits including this one from StackOverflow:



If you know which statements might fail, and how they might fail, then you can use exception handling to specifically clean up the problems which might occur with a particular block of statements before moving on to the next section.




1) An option may be to put a try...except block around the line you suspect will cause the problem, namely the CopyFeatures tool.


2) See also the Python reference on errors, specifically section 8.3. Once you have a reference to "e" you may be able to determine its exception type and handle it as required.


Eg this StackOverflow question contains a similar workflow to yours:


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"

In your case, in place of "IndexError" you'd use whatever you determined the exception type to be for a corrupt shapefile


No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...