나는 상대적인 파이썬 초보자이며 예외를 올바르게 처리하는 방법과 혼동을 느낍니다. 바보 같은 질문에 사과.try/except /를 내부 함수 및 메인 함수와 함께 올바르게 사용하는 방법
내 main()에서 날짜 목록을 반복하고 각 날짜에 공용 웹 서버에서 CSV 파일을 다운로드하는 함수를 호출합니다. 확실한 이유로 예외를 제대로 잡으려고하지만 특히 관심있는 파일을 다운로드 할 수 있는지 여부를 알 수 없기 때문에 예외를 잡으려고합니다. 내 프로그램은 cron 작업의 일부로 실행되며 가능한 경우 3 시간마다이 파일을 다운로드하려고 시도합니다.
내가 원하는 것은 날짜 목록에서 첫 번째 파일을 다운로드하고 그 결과가 404 일 경우 목록의 가장 오래된 날짜를 사용할 수 없다고 가정하기 때문에 프로그램이 다음 파일로 진행하지 않아야합니다. 그 다음에 오는 다른 사람도 그 중 하나도 사용할 수 없습니다.
다음 파이썬 의사 코드가 있습니다. 파일을 다운로드하려고 시도하지만 함수 내부에서 예외가 발생하면 try/except 블록을 사용하지만 예외가 main()에서 제대로 처리되면 다음 날짜로 진행할지 여부를 결정할 수 있습니다. 다운로드를 수행하는 함수를 만든 이유는 나중에 다른 파일 유형의 동일한 main() 블록에서 해당 코드를 다시 사용하기 때문입니다.
def main():
...
...
# datelist is a list of date objects
for date in datelist:
download_file(date)
def download_file(date):
date_string = str(date.year) + str(date.strftime('%m')) + str(date.strftime('%d'))
request = HTTP_WEB_PREFIX+ date_string + FILE_SUFFIX
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
print "HTTPError = " + str(e)
except urllib2.URLError, e:
print "URLError = " + str(e)
except httplib.HTTPException, e:
print "HTTPException = " + str(e)
except IOError:
print "IOError = " + str(e)
except Exception:
import traceback
print "Generic exception: " + traceback.format_exc()
else:
print "No problem downloading %s - continue..." % (response)
try:
with open(TMP_DOWNLOAD_DIRECTORY + response, 'wb') as f:
except IOError:
print "IOError = " + str(e)
else:
f.write(response.read())
f.close()
아주 사려 깊은 설명. 관련된 개념을 더 잘 이해하는 데 도움이되었습니다. 알겠습니다. 고맙습니다. – codingknob