2012-10-12 38 views
0

我可以使用一些關於如何處理Python腳本中的錯誤的建議。從閱讀本網站上的所有Python錯誤處理帖子所能獲得的信息是,您不能簡單地繞過for循環中的錯誤,並嘗試使用continue語句。相反,你必須直接處理每個錯誤。這是我遇到問題的地方。我附加了發生在for循環中間的錯誤消息。此外,我重視我的腳本,通過以下流程移動:錯誤處理Python arcpy腳本需要的建議

  1. 周圍發生光柵
  2. 地方多邊形
  3. 的平均中心點的一多邊形用點來識別特定的縣其 相應的光柵相關
  4. 夾根據所選擇的縣多邊形

如何incorporat光柵e將錯誤信息中的信息轉換爲除continue語句之外的try,以便腳本可以移動到列表中的下一個柵格,而不是在處理過程中停止?

# Import arcpy module 
import arcpy 
from arcpy import env 
from arcpy.sa import * 
arcpy.CheckOutExtension("3D") 

# Set Over write 
arcpy.env.overwriteOutput = 1 

# Set the workspace 
env.workspace = r"Z:\temp.gdb" 
outworkspace = r"Z:\location2\temp2.gdb" 

# Local variables: 
counties = r"Z:\temp.gdb\boundaries\Counties" 
counties_lyr = arcpy.MakeFeatureLayer_management(counties,"counties_lyr") 

# Get the list of rasters to process 
raster_list = arcpy.ListRasters("*_clp") 
print raster_list 

for raster in raster_list: 
    # Define name and location for output raster 
    name = outworkspace + "\\" + str(raster) 

    # Process: Raster Domain 
    arcpy.RasterDomain_3d(raster, "in_memory/temp", "POLYGON") 

    # Process: Central Feature 
    arcpy.MeanCenter_stats("in_memory/temp", "in_memory/temp1") 

    # Process: Select Layer By Location 
    arcpy.SelectLayerByLocation_management(counties_lyr, "intersect", "in_memory/temp1", "", "NEW_SELECTION") 

    # Clip Raster 
    arcpy.Clip_management(raster, "#", name,counties_lyr, "#", "ClippingGeometry") 

    # Delete in_memory 
    arcpy.Delete_management("in_memory") 

    print "processing " + raster + " complete..." 

print "All processing is now finished" 

enter image description here

回答

1

這是你所需要的?如果for循環中任何單獨的柵格發生任何錯誤,那麼它將打印出回溯,然後轉到下一個。

import traceback 

# Import arcpy module 
import arcpy 
from arcpy import env 
from arcpy.sa import * 
arcpy.CheckOutExtension("3D") 

# Set Over write 
arcpy.env.overwriteOutput = 1 

# Set the workspace 
env.workspace = r"Z:\temp.gdb" 
outworkspace = r"Z:\location2\temp2.gdb" 

# Local variables: 
counties = r"Z:\temp.gdb\boundaries\Counties" 
counties_lyr = arcpy.MakeFeatureLayer_management(counties,"counties_lyr") 

# Get the list of rasters to process 
raster_list = arcpy.ListRasters("*_clp") 
print raster_list 

for raster in raster_list: 
    try: 
     # Define name and location for output raster 
     name = outworkspace + "\\" + str(raster) 

     # Process: Raster Domain 
     arcpy.RasterDomain_3d(raster, "in_memory/temp", "POLYGON") 

     # Process: Central Feature 
     arcpy.MeanCenter_stats("in_memory/temp", "in_memory/temp1") 

     # Process: Select Layer By Location 
     arcpy.SelectLayerByLocation_management(counties_lyr, "intersect", "in_memory/temp1", "", "NEW_SELECTION") 

     # Clip Raster 
     arcpy.Clip_management(raster, "#", name,counties_lyr, "#", "ClippingGeometry") 

     # Delete in_memory 
     arcpy.Delete_management("in_memory") 

     print "processing " + raster + " complete..." 

    except: 
     print "Something went wrong handling " + str(raster) + ". Here's a traceback:" 
     traceback.print_exc() 
     continue 

print "All processing is now finished" 

這是一個懶惰的程序員的實現,包裝的整個內容的for循環中嘗試...除了...塊,將捕獲的任何類型的任何地方塊例外。根據你的需求和口味,你可能會發現它更有用(或者更簡單)只捕獲你在練習中遇到的特定錯誤,就像dm03514所建議的那樣 - 但我認爲對於這樣的一個小腳本來說,它的輸出是即將被人看到,你所做的並不重要。

正如您在問題中指定的那樣,對您來說可能很重要的是您在發生錯誤時看到回溯。這就是traceback.print_exc()進來的地方。:)

1

你可以在一個錯誤處理for循環。將代碼封裝在try塊中將允許您在參數無效的情況下處理錯誤。

try: 

# Process: Raster Domain 
    arcpy.RasterDomain_3d(raster, "in_memory/temp", "POLYGON") 

except ExcecuteError: 
    continue 

這項工作將您的循環內其基本上是說,如果發生異常問題上continue這意味着去到下一個循環迭代。

你可以在任何地方放置try塊,因爲Mark Amery建議你可以在try中包裝整個for循環體。

1

我不知道arcpy。但也許處理行969異常與:

try: 
    your stuff 

except arcpy.ExecuteError, error: 
    print error 

可以幫助。

1

對於你對try/except/continue for for循環所說的話不太清楚。以下內容鬆散地基於您提供的代碼。

def failing_func(raster): 
    raise ValueError("raster <%s> function has failed" % (raster)) 

def working_func(raster): 
    print("raster <%s> function has succeeded" % (raster)) 
    return True 

raster_list = [0, 1, 2, 3, 4, 5] 

for raster in raster_list: 
    print("Processing <%s>" % (raster)) 

    try: 
     v1 = working_func("raster_1") 
     v2 = failing_func("raster_2") 
     v3 = working_func("raster_3") 
     v4 = failing_func("raster_4") 
     v5 = working_func("raster_5") 
    except ValueError, e: 
     print("Exception was raised: %s when processing item %s" % (str(e), raster)) 
     continue 

,輸出:

Processing <0> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 0 
Processing <1> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 1 
Processing <2> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 2 
Processing <3> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 3 
Processing <4> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 4 
Processing <5> 
raster <raster_1> function has succeeded 
Exception was raised: raster <raster_2> function has failed when processing item 5