कैसे / जबकि पाश के लिए arcpy में त्रुटियों को दरकिनार करने के लिए?


10

मेरे पास एक आसान स्क्रिप्ट टूल है जो एक कार्यक्षेत्र के माध्यम से लूप करता है और एक आकृति डाटासेट के आकार और नाम को कॉपी करता है। हालाँकि, यदि कार्यक्षेत्र में कहीं दूषित आकृति है तो स्क्रिप्ट विफल हो जाती है और प्रसंस्करण बंद हो जाता है।

आप इस तरह की त्रुटियों को कैसे संभालते हैं? क्या त्रुटि फ़ाइल को प्रिंट करने और लूप को पूरा करने के लिए अगले शेपफाइल को संसाधित करने का एक तरीका है?

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 का प्रयास करें। यह StackOverflow से एक सहित कई हिट देता है :

यदि आप जानते हैं कि कौन से कथन विफल हो सकते हैं, और वे कैसे विफल हो सकते हैं, तो आप विशेष रूप से उन समस्याओं को साफ करने के लिए अपवाद हैंडलिंग का उपयोग कर सकते हैं जो अगले खंड पर जाने से पहले बयानों के एक विशेष ब्लॉक के साथ हो सकती हैं।

1) एक विकल्प हो सकता है कि try...exceptआप जिस रेखा पर संदेह करते हैं उसके चारों ओर एक ब्लॉक लगाएं, जो समस्या का कारण बनेगा, जिसका नाम है CopyFeatures टूल।

2) त्रुटियों पर पायथन संदर्भ भी देखें , विशेष रूप से खंड 8.3। एक बार जब आप "ई" का संदर्भ लेते हैं तो आप इसके अपवाद प्रकार को निर्धारित करने में सक्षम हो सकते हैं और इसे आवश्यकतानुसार संभाल सकते हैं।

उदा। इस 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 = [] लूप से पहले और सेक्शन लाइन को छोड़कर इससे पहले CONTINUE do ErrLst.append (shp)। कार्यक्रम के अंत में - ErrLst में l के लिए-- प्रिंट >> file.txt, l। यह फाइल करने के लिए आपकी सूची को प्रिंट करना चाहिए। मैंने इसका परीक्षण नहीं किया लेकिन काम करना चाहिए।
तोमक

धन्यवाद स्टीफन, कोशिश / छोड़कर-जारी ब्लॉक चाल करेंगे।
आरोन

7

जैसा कि स्टीफन ने पहले ही कहा था कि आप किसी अन्य प्रयास में CopyFeatures टूल को संलग्न कर सकते हैं ... ब्लॉक को छोड़कर।

यदि उपकरण एक विशिष्ट शेपफाइल के साथ विफल हो जाता है तो आप टूल मैसेज को कहीं भी लॉग इन कर सकते हैं (मैं हमेशा इसे एसटीडीयूएस पर प्रिंट करता हूं और आउटपुट को एक लॉगफाइल पर पाइप करता हूं जब मैं स्क्रिप्ट चलाता हूं)।

मुझे जो भी जोड़ना है वह है: अपवाद के पास के अलावा ब्लॉक में आपको त्रुटि संदेश भी प्रिंट करना होगा जो टूल स्वयं उत्पन्न करता है। आप अपवाद द्वारा टूल संदेशों तक पहुँच प्राप्त नहीं करते हैं (जैसा कि यह सुनिश्चित करने के लिए होना चाहिए) लेकिन कॉल करने से आर्कपी ऑब्जेक्ट से

arcpy.getmessages(messageCount - 1)

देखें http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 कि यह कैसे और कॉल करने के लिए कैसे पिछले संदेशों जो संभवतः विशिष्ट शेपफ़ाइल त्रुटि से जुड़े हुए हैं पाने के लिए।

इसे लॉग करने के बाद आप बस स्क्रिप्ट को अन्य शेपफाइल्स के साथ जारी रखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.