Arcpy için / while döngüsündeki hatalar nasıl atlanır?


10

Ben bir çalışma alanı üzerinden döngüler ve bir özellik veri kümesine şekil dosyaları yeniden adlandırır ve kopyalar kullanışlı bir komut dosyası var. Ancak, çalışma alanının herhangi bir yerinde bozuk bir şekil dosyası varsa, komut dosyası başarısız olur ve işlemeyi durdurur.

Bunun gibi hataları nasıl ele alırsınız? Hata dosyasını yazdırmanın ve for döngüsü tamamlanacak sonraki şekil dosyasını işlemeye devam etmenin bir yolu var mı?

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

Yanıtlar:


15

"Sonraki hata devamında python" veya benzeri için Google'ı deneyin. Bu, StackOverflow'dan buna dahil bir dizi isabet döndürür :

Hangi ifadelerin başarısız olabileceğini ve nasıl başarısız olabileceğini biliyorsanız, sonraki bölüme geçmeden önce belirli bir ifade bloğunda ortaya çıkabilecek sorunları özel olarak temizlemek için özel durum işleme özelliğini kullanabilirsiniz.

1) Bir seçenek try...except, soruna neden olduğundan şüphelendiğiniz satırın etrafına, yani CopyFeatures aracı olarak bir blok koymak olabilir.

2) Hatalarla ilgili Python referansına da bakınız , özellikle bölüm 8.3. Bir kez "e" referansınız olduğunda, istisna türünü belirleyebilir ve gerektiği gibi işleyebilirsiniz.

Örneğin, bu StackOverflow sorusu sizinkine benzer bir iş akışı içeriyor:

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"

Sizin durumunuzda, "IndexError" yerine, bozuk bir şekil dosyası için istisna türünü belirlediğiniz her şeyi kullanırsınız


1
Ayrıca, shp adınızı hariç bölümdeki hata listesine eklemeyi deneyebilirsiniz. İe'nizi tanımlayın. ErrLst = [] FOR döngüsünden önce ve CONTINUE öncesi hariç bölüm satırında ErrLst.append (shp) yapın. Programın sonunda ErrLst içinde l için şunu yapın: print >> file.txt, l. Bu, listenizi dosyaya yazdırmalıdır. Test etmedim ama çalışmalıyım.
Tomek

Teşekkürler Stephen, dene / devam et bloğu işe yarayacak.
Aaron

7

Stephen'ın daha önce de belirttiği gibi, CopyFeatures Aracını Block hariç başka bir denemeye dahil edebilirsiniz.

Araç belirli bir Shapefile ile başarısız olursa, Araç Mesajını bir yere kaydedebilirsiniz (her zaman STDOUT'ta yazdırırım ve komut dosyasını çalıştırdığımda çıktıları bir günlük dosyasına bağlarım).

Ne eklemeliyim: İstisna Blok yanındaki İstisna Blok içinde de Araç kendisi üretilen hata mesajlarını yazdırmak zorunda. İstisna ile Araç mesajlarına erişemezsiniz (kesin olarak olması gerektiği gibi), ancak çağrı yaparak arcpy Nesnesinden

arcpy.getmessages(messageCount - 1)

Http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 nasıl çağrılacağına ve belirli Shapefile Hatası ile ilgili son iletilerin nasıl alınacağına bakın .

Bunu kaydettikten sonra komut dosyasının diğer şekil dosyalarıyla devam etmesine izin vermeniz yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.