설정
예외를 언제 어떻게 사용하는지 결정하는 데 종종 어려움이 있습니다. 간단한 예를 생각해 봅시다. " http://www.abevigoda.com/ "과 같이 웹 페이지를 긁어 Abe Vigoda가 아직 살아 있는지 확인 한다고 가정 해 봅시다 . 이렇게하려면 페이지를 다운로드하고 "Abe Vigoda"라는 문구가 나타나는 시간을 찾기 만하면됩니다. Abe의 상태가 포함되어 있으므로 첫 번째 모양을 반환합니다. 개념적으로 다음과 같습니다.
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
여기서 parse_abe_status(s)
"Abe Vigoda is something " 형식의 문자열을 가져 와서 " something "부분을 반환합니다 .
Abe의 상태를 위해이 페이지를 긁어내는 훨씬 더 강력하고 강력한 방법이 있다고 주장하기 전에, 이것이 내가있는 일반적인 상황을 강조하기 위해 사용되는 단순하고 고안된 예일뿐임을 기억하십시오.
이 코드는 어디에 문제가 생길 수 있습니까? 다른 오류 중에서 "예상되는"오류는 다음과 같습니다.
download_page
페이지를 다운로드하지 못할 수 있으며를 던집니다IOError
.- URL이 오른쪽 페이지를 가리 키지 않거나 페이지가 잘못 다운로드되어 적중이 없습니다.
hits
그런 다음 빈 목록입니다. - 웹 페이지가 변경되어 페이지에 대한 가정이 잘못되었을 수 있습니다. 어쩌면 Abe Vigoda에 대한 언급이 4 개일 것으로 예상되지만 5를 찾습니다.
- 어떤 이유로
hits[0]
"Abe Vigoda is something " 형식의 문자열이 아니므로 올바르게 구문 분석 할 수 없습니다.
첫 번째 경우는 실제로 문제가되지 않습니다. IOError
가 발생하여 내 함수 호출자가 처리 할 수 있습니다. 다른 경우와 처리 방법을 고려해 봅시다. 그러나 먼저, 우리가 parse_abe_status
가능한 가장 어리석은 방법으로 구현한다고 가정 해 봅시다 .
def parse_abe_status(s):
return s[13:]
즉, 오류 검사를 수행하지 않습니다. 이제 옵션으로 이동하십시오.
옵션 1 : 반품 None
발신자에게 다음을 반환하여 문제가 발생했다고 알릴 수 있습니다 None
.
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
if not hits:
return None
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
발신자가 수신하는 경우 None
내 함수에서, 그는 더는 아베 비고 다의 언급하고, 그래서 거기 없다고 가정한다 뭔가 잘못. 그러나 이것은 매우 모호합니다. 그리고 hits[0]
우리가 생각했던 것과 다른 경우에는 도움 이되지 않습니다.
반면에, 우리는 몇 가지 예외를 둘 수 있습니다 :
옵션 2 : 예외 사용
hits
비어 있으면 IndexError
시도 할 때가 발생 hits[0]
합니다. 그러나 발신자는 그것이 IndexError
어디에서 IndexError
왔는지 전혀 모르기 때문에 내 함수에 의해 발생 되는 것을 처리해서는 안됩니다 . find_all_mentions
그가 아는 모든 것에 의해 던져 질 수 있었다 . 이를 처리하기 위해 사용자 정의 예외 클래스를 작성합니다.
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
이제 페이지가 변경되어 예상치 못한 히트가 발생하면 어떻게됩니까? 코드가 여전히 작동 할 수 있기 때문에 이것은 치명적이지 않지만 호출자는 매우 주의를 기울이거나 경고를 기록 할 수 있습니다. 그래서 나는 경고를 던질 것이다.
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# say we expect four hits...
if len(hits) != 4:
raise Warning("An unexpected number of hits.")
logger.warning("An unexpected number of hits.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
# he's either alive or dead
return status == "alive"
마지막으로, 우리는 그것이 status
살아 있거나 죽지 않았다는 것을 알 수 있습니다 . 어쩌면, 이상한 이유로 오늘은로 밝혀졌습니다 comatose
. 그런 다음 False
Abe가 죽었다는 것을 암시 하기 때문에 돌아가고 싶지 않습니다 . 여기서 무엇을해야합니까? 아마도 예외를 던져라. 그러나 어떤 종류? 사용자 정의 예외 클래스를 작성해야합니까?
class NotFoundError(Exception):
"""Throw this when something can't be found on a page."""
def get_abe_status(url):
# download the page
page = download_page(url)
# get all mentions of Abe Vigoda
hits = page.find_all_mentions("Abe Vigoda")
try:
hits[0]
except IndexError:
raise NotFoundError("No mentions found.")
# say we expect four hits...
if len(hits) != 4:
raise Warning("An unexpected number of hits.")
logger.warning("An unexpected number of hits.")
# parse the first hit for his status
status = parse_abe_status(hits[0])
if status not in ['alive', 'dead']:
raise SomeTypeOfError("Status is an unexpected value.")
# he's either alive or dead
return status == "alive"
옵션 3 : 중간에
예외가있는 두 번째 방법이 바람직하다고 생각하지만 예외를 올바르게 사용하고 있는지 확실하지 않습니다. 더 숙련 된 프로그래머가이 문제를 어떻게 처리 할 수 있는지 궁금합니다.