Як обійти помилки в arcpy для циклу / while?


10

У мене є зручний інструмент для сценаріїв, який проходить через робочу область і перейменовує та копіює файли форм у набір даних. Однак якщо в робочій області десь зіпсований файл форми, скрипт виходить з ладу і припиняє обробку.

Як ви обробляєте такі помилки? Чи є спосіб надрукувати файл помилки та продовжити обробку наступного файлу форм у циклі for для завершення?

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

Відповіді:


15

Спробуйте Googling для "python on error resume next" або подібного. Це повертає ряд звернень, включаючи цей із 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"

У вашому випадку замість "IndexError" ви використовуєте те, що ви визначили, тип винятку для пошкодженого файлу форм


1
Ви також можете спробувати додати своє ім'я shp до списку помилок, крім розділу. Визначте, тобто. ErrLst = [] перед циклом FOR і, крім рядка розділу перед CONTINUE, зробіть ErrLst.append (shp). В кінці програми зробіть для l в ErrLst: print >> file.txt, l. Це має надрукувати список для подання. Я цього не тестував, але повинен працювати.
Томек

Дякую, Стівен, блок "спробувати / крім-продовжити" зробить свою справу.
Аарон

7

Як вже сказав Стівен, ви можете застосувати інструмент CopyFeatures в іншій спробі ... крім блоку.

Якщо інструмент не працює з певним Shapefile, ви можете занести повідомлення інструменту десь (я завжди друкую його на STDOUT і передаю висновки в журнал, коли я запускаю сценарій).

Що я мушу додати, це: у «Окрім блоку», крім «Винятку», ви також повинні надрукувати повідомлення про помилки, які створив сам Інструмент. Ви не отримуєте доступ до повідомлень Інструменту за винятком (як це повинно бути точно), але від аркпійного об'єкта, зателефонувавши

arcpy.getmessages(messageCount - 1)

Дивіться http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000, як його викликати та як отримати останні повідомлення, які, можливо, пов'язані з конкретною помилкою Shapefile.

Після реєстрації ви просто дозволите сценарію продовжувати роботу з іншими формами файлів

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.