লুপের জন্য / যখন আরকিপিতে ত্রুটিগুলি কীভাবে বাইপাস করবেন?


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

"অজগর অন ত্রুটি পুনরায় শুরু" বা অনুরূপ জন্য গুগলিং চেষ্টা করুন। এটি স্ট্যাকওভারফ্লো থেকে এটি সহ কয়েকটি হিট দেয় :

আপনি যদি জানেন যে কোন বিবৃতি ব্যর্থ হতে পারে এবং সেগুলি কীভাবে ব্যর্থ হতে পারে, তবে আপনি পরবর্তী বিভাগে যাওয়ার আগে নির্দিষ্ট বিবৃতিগুলির একটি নির্দিষ্ট ব্লকের সাথে দেখা দিতে পারে এমন সমস্যাগুলি পরিষ্কার করতে আপনি ব্যতিক্রম হ্যান্ডলিং ব্যবহার করতে পারেন।

1) একটি বিকল্প try...exceptহ'ল লাইনটির আশেপাশে একটি ব্লক স্থাপন করা আপনার সমস্যার কারণ হতে পারে কপিফিটচার্স সরঞ্জাম।

২) ত্রুটিগুলির জন্য পাইথন রেফারেন্সটি দেখুন , বিশেষত বিভাগ 8.3। একবার আপনার "ই" এর রেফারেন্স পেলে আপনি এর ব্যতিক্রম প্রকারটি নির্ধারণ করতে এবং প্রয়োজনীয় হিসাবে এটি পরিচালনা করতে সক্ষম হতে পারেন।

উদাহরণস্বরূপ, এই স্ট্যাকওভারফ্লো প্রশ্নটিতে আপনার অনুরূপ ওয়ার্কফ্লো রয়েছে:

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"

আপনার ক্ষেত্রে, "ইনডেক্সেরর" এর জায়গায় আপনি ব্যতিক্রম প্রকারটি দূষিত শেফফিলের জন্য নির্ধারণ করে যা ব্যবহার করবেন


1
আপনি বিভাগের ব্যতীত ত্রুটি তালিকায় আপনার shp নাম যুক্ত করার চেষ্টা করতে পারেন। আপনার অর্থ নির্ধারণ করুন। এররলস্ট = [] লুপের আগে এবং বিভাগের লাইন বাদে কনটিনিউয়ের আগে এরআরএলস্ট.এপেন্ড (shp) করুন। প্রোগ্রাম শেষে do---- এরারলস্টে l এর জন্য: মুদ্রণ >> file.txt, এল। এটি ফাইলের জন্য আপনার তালিকা মুদ্রণ করা উচিত। আমি এটি পরীক্ষা করিনি তবে কাজ করা উচিত।
টোমেক

ধন্যবাদ স্টিফেন, চেষ্টা / বাদে-অবিরত ব্লকটি কৌশলটি করবে।
হারুন

7

যেহেতু স্টিফেন ইতিমধ্যে বলেছে আপনি কপিফাইটার্স সরঞ্জামটি ব্লক ব্যতীত অন্য একটি চেষ্টাতে বন্ধ করতে পারেন।

যদি সরঞ্জামটি কোনও নির্দিষ্ট শেফিলের সাথে ব্যর্থ হয় তবে আপনি টুল বার্তাটি কোথাও লগইন করতে পারেন (আমি সবসময় এটি STDOUT এ মুদ্রণ করি এবং স্ক্রিপ্টটি চালানোর সময় আউটপুটগুলিকে একটি লগফাইলে পাইপ করি)।

আমাকে যা যুক্ত করতে হবে তা হল: ব্যতিক্রম ব্যতীত ব্লক ব্যতীত আপনাকে নিজেই তৈরি হওয়া ত্রুটি বার্তাগুলি মুদ্রণ করতে হবে। আপনি ব্যতিক্রম দ্বারা সরঞ্জাম বার্তাগুলিতে অ্যাক্সেস পাবেন না (এটি অবশ্যই নিশ্চিত হওয়া উচিত) তবে আর্কি অবজেক্ট থেকে কল করে

arcpy.getmessages(messageCount - 1)

Http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 এ কীভাবে কল করবেন এবং শেষ বার্তাগুলি কীভাবে সম্ভবত নির্দিষ্ট শেফিল ত্রুটির সাথে সম্পর্কিত তা কীভাবে পাবেন তা দেখুন ।

এটি লগ করার পরে আপনি কেবল অন্য স্ক্র্যাপফাইলে স্ক্রিপ্টটি চালিয়ে যেতে দিন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.