0

我可以就如何处理 Python 脚本中的错误提出一些建议。从我通过阅读该站点上的所有 Python 错误处理帖子所收集到的信息来看,您不能简单地使用 try except continue 语句绕过 for 循环中的错误。相反,您必须直接处理每个错误。这是我在将它们捆绑在一起时遇到问题的地方。我附上了在 for 循环中间发生的错误消息。此外,我附上了我的脚本,该脚本通过以下工作流程:

  1. 在栅格周围放置一个多边形
  2. 在多边形的平均中心上放置一个点
  3. 使用该点来标识与其相应栅格关联的特定县
  4. 根据选定的县多边形裁剪栅格

如何将错误消息中的信息合并到 try except continue 语句中,以便脚本可以移动到列表中的下一个栅格,而不是在处理过程中停止?

# 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"

在此处输入图像描述

4

4 回答 4

1

您可以在 for 循环中处理错误。将代码包装在 try except 块中将允许您在参数无效的情况下处理错误。

try:

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

except ExcecuteError: 
  continue

这将在您的循环内发生,它基本上说如果异常发生问题 a continue,这意味着继续下一个循环迭代。

您可以将 try except 块放在任何地方,正如 Mark Amery 建议的那样,您也可以将整个 for 循环体包装在 try except 中。

于 2012-10-12T18:20:22.977 回答
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 循环的全部内容包装在一个 try...except... 块中,该块将捕获块中任何位置的任何类型的异常。根据您的需求和品味,您可能会发现仅捕获您在实践中遇到的特定错误更有帮助(或更优雅),正如 dm03514 所建议的那样 - 但我认为对于这样的小脚本,其输出是会被人看到,不管你做什么。

正如您在问题中指定的那样,对您来说可能很重要的是,当错误发生时您会看到回溯。这就是 traceback.print_exc() 的用武之地。:)

于 2012-10-12T18:22:16.423 回答
1

我不知道arcpy。但也许处理第 969 行中的异常:

try:
    your stuff

except arcpy.ExecuteError, error:
    print error

有帮助。

于 2012-10-12T18:23:59.453 回答
1

不太清楚您在 for 循环中所说的 try/except/continue 是什么。以下内容大致基于您提供的代码。

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
于 2012-10-12T18:43:01.183 回答