순환 for / while 루프에서 오류를 무시하는 방법은 무엇입니까?


10

작업 공간을 반복하고 모양 파일의 이름을 바꾸고 피쳐 데이터 세트로 복사하는 편리한 스크립트 도구가 있습니다. 그러나 작업 공간 어딘가에 손상된 쉐이프 파일이 있으면 스크립트가 실패하고 처리가 중지됩니다.

이와 같은 오류를 어떻게 처리합니까? 오류 파일을 인쇄하고 for 루프에서 다음 shapefile을 계속 처리하는 방법이 있습니까?

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

"다음에 이력서가 다시 시작될 때 파이썬"또는 이와 유사한 방법으로 인터넷 검색을 사용해보세요. StackOverflow 에서 이것을 포함하여 다수의 적중을 리턴합니다 .

어떤 명령문이 실패하고 어떻게 실패하는지 알고 있으면 예외 처리를 사용하여 다음 섹션으로 넘어 가기 전에 특정 명령문 블록에서 발생할 수있는 문제를 구체적으로 정리할 수 있습니다.

1) 옵션은 try...except문제를 일으킬 것으로 의심되는 선 (예 : CopyFeatures 도구) 주위 에 블록 을 배치하는 것입니다.

2) 오류 에 대한 파이썬 참조 , 특히 8.3 단원을 참조하십시오 . "e"에 대한 참조가 있으면 예외 유형을 판별하고 필요에 따라 처리 할 수 ​​있습니다.

예를 들어이 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"대신에 손상된 shapefile에 대해 예외 유형을 결정한 모든 것을 사용합니다.


1
예외 섹션의 오류 목록에 shp 이름을 추가 할 수도 있습니다. 즉 당신의 정의. FOR 루프 앞의 ErrLst = [] 및 CONTINUE 앞의 제외 섹션 행에서 ErrLst.append (shp)를 수행하십시오. 프로그램이 끝나면 ErrLst에서 l : print >> file.txt, l을 수행하십시오. 목록을 파일로 인쇄해야합니다. 나는 그것을 테스트하지 않았지만 작동해야합니다.
Tomek

try / except-continue 블록이 트릭을 수행 할 것입니다.
Aaron

7

Stephen은 이미 CopyFeatures Tool을 다른 시도 ... 블록을 제외하고 묶을 수 있다고 말했습니다.

도구가 특정 Shapefile로 실패하면 도구 메시지를 어딘가에 기록 할 수 있습니다 (스크립트를 실행할 때 항상 STDOUT에 인쇄하고 출력을 로그 파일로 파이프).

내가 추가해야 할 것은 : 예외 옆의 제외 블록에서 도구 자체가 생성 한 오류 메시지도 인쇄해야합니다. 예외에 의해 도구 메시지에 액세스 할 수는 없지만 (확실해야하므로) 호출하여 arcpy Object에서

arcpy.getmessages(messageCount - 1)

http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//000v0000000m000000 호출 방법 및 특정 Shapefile 오류와 관련된 마지막 메시지를 얻는 방법을 참조 하십시오 .

이것을 기록한 후에는 스크립트가 다른 shapefile로 계속 진행하게합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.