0

Python スクリプトでエラーを処理する方法について、いくつかのアドバイスを使用できます。このサイトのすべての Python エラー処理の投稿を読んで収集できたのは、for ループ内のエラーを単に try except continue ステートメントでバイパスすることはできないということです。代わりに、各エラーを直接処理する必要があります。これは、すべてをまとめるのに問題があるところです。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ループ内の個々のラスターで問題が発生した場合は、トレースバックが出力され、次のラスターに移動します。

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 ...ただし、ブロック内の任意のタイプの例外をキャッチするブロックを除いてラップします。ニーズや好みによっては、dm03514が示唆しているように、実際に発生している特定のエラーのみをキャッチする方が便利(または単にエレガント)な場合がありますが、このような小さなスクリプトの場合、出力は次のようになります。人間に見られるようになるので、どちらをするかは関係ありません。

質問で指定したように、おそらく重要なのは、エラーが発生したときにトレースバックが表示されることです。そこで、traceback.print_exc()が登場します。:)

于 2012-10-12T18:22:16.423 に答える
1

私はアークピーを知りません。しかし、おそらく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 に答える
1

for ループでエラーを処理できます。コードを try except ブロックでラップすると、パラメーターが無効な場合にエラーを処理できます。

try:

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

except ExcecuteError: 
  continue

これはループ内で行われ、例外が発生した場合continue、次のループ反復に進むことを意味します。

try except ブロックはどこにでも配置できます。Mark Amery が示唆したように、for ループ本体全体を try except でラップすることもできます。

于 2012-10-12T18:20:22.977 に答える