如何绕过arcpy for / while循环中的错误?


10

我有一个方便的脚本工具,该脚本工具在工作空间中循环并重命名shapefile并将其复制到要素数据集。但是,如果工作空间中某个位置的shapefile损坏,则脚本将失败并停止处理。

您如何处理此类错误?有没有办法打印错误文件并继续处理for循环中的下一个shapefile,直到完成?

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

Answers:


15

尝试使用Google搜索来搜索“下一次错误恢复时的python”或类似内容。这会返回许多匹配,包括来自StackOverflow的匹配:

如果知道哪些语句可能失败以及如何失败,那么可以在继续下一节之前使用异常处理专门清理特定语句块可能出现的问题。

1)一种选择是try...except在您怀疑会导致问题的线周围放置一个块,即CopyFeatures工具。

2)另请参阅关于错误的Python参考,特别是第8.3节。一旦引用了“ e”,就可以确定其异常类型并根据需要进行处理。

例如,此StackOverflow 问题包含与您类似的工作流程:

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"

在您的情况下,可以使用您确定异常类型为损坏的shapefile代替“ IndexError”


1
您也可以尝试将shp名称添加到“例外”部分中的错误列表中。定义您的ie。在FOR循环之前和在CONTINUE之前的除外节中的​​ErrLst = []进行ErrLst.append(shp)。在程序结尾处,对ErrLst中的l执行:print >> file.txt,l。这应该将您的列表打印到文件中。我没有测试,但应该可以。
Tomek'9

感谢Stephen,try / except-continue块可以解决问题。
亚伦

7

正如斯蒂芬已经说过的那样,您可以将CopyFeatures Tool包含在另一种尝试中……除了Block。

如果该工具失败并带有特定的Shapefile,则可以将工具消息记录在某处(我始终在STDOUT上打印该消息,并在运行脚本时将输出通过管道传递到日志文件中)。

我要添加的是:在例外旁边的Except块中,您还必须打印工具本身产生的错误消息。您不能通过Exception(这应该是肯定的)来访问Tool消息,而是通过调用arcpy Object

arcpy.getmessages(messageCount - 1)

请参阅http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000如何调用它以及如何获取可能与特定Shapefile错误有关的最后一条消息。

记录此内容后,您只需让脚本与其他shapefile一起继续

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.