예외 발생 대 함수에서 None 반환?
Python의 사용자 정의 함수에서 더 나은 방법 : raise
예외 또는 return None
? 예를 들어 폴더에서 가장 최근 파일을 찾는 기능이 있습니다.
def latestpdf(folder):
# list the files and sort them
try:
latest = files[-1]
except IndexError:
# Folder is empty.
return None # One possibility
raise FileNotFoundError() # Alternative
else:
return somefunc(latest) # In my case, somefunc parses the filename
또 다른 옵션은 예외를두고 발신자 코드에서 처리하지만, 나는 그것이 다루는 더 분명 파악 FileNotFoundError
보다 IndexError
. 아니면 다른 이름으로 예외를 다시 제기하는 것이 나쁜 형식입니까?
그것은 정말로 의미론의 문제입니다. 무슨 foo = latestpdf(d)
뜻 이야?
최신 파일이 없다는 것이 완벽하게 합리적입니까? 그런 다음 None을 반환하십시오.
항상 최신 파일을 찾길 원하십니까? 예외를 발생시킵니다. 그리고 예, 더 적절한 예외를 다시 제기하는 것은 괜찮습니다.
이것이 모든 디렉토리에 적용되어야하는 일반적인 함수 인 경우 전자를 수행하고 None을 반환합니다. 예를 들어 디렉터리가 응용 프로그램의 알려진 파일 집합을 포함하는 특정 데이터 디렉터리를 의미하는 경우 예외를 발생시킵니다.
질문에 대한 답변이 될 수 있으므로 질문에 답변하기 전에 몇 가지 제안을하겠습니다.
- 항상 설명적인 이름을 지정하십시오.
latestpdf
누구에게도 거의 의미가 없지만 기능을 살펴보면latestpdf()
최신 pdf를 얻을 수 있습니다 . 이름을 지정하는 것이 좋습니다getLatestPdfFromFolder(folder)
.
이 작업을 수행하자마자 무엇을 반환해야하는지 명확 해졌습니다. pdf가 없으면 예외를 발생시킵니다. 하지만 거기서 더 기다려 ..
- 기능을 명확하게 정의하십시오. somefuc이 무엇을해야하는지 분명하지 않고 그것이 최신 pdf를 얻는 것과 어떻게 관련되는지 (분명히) 분명하지 않기 때문에 나는 당신이 그것을 옮길 것을 제안합니다. 이것은 코드를 훨씬 더 읽기 쉽게 만듭니다.
for folder in folders:
try:
latest = getLatestPdfFromFolder(folder)
results = somefuc(latest)
except IOError: pass
도움이 되었기를 바랍니다!
파이썬은 동적으로 입력되기 때문에 일반적으로 내부적으로 예외를 처리하는 것을 선호합니다 (즉, 호출 된 함수 내에서 try / except, 가능하면 None 반환). 일반적으로 나는 그것이 어떤 식 으로든 판단 호출이라고 생각하지만 동적으로 입력되는 언어에서는 예외를 호출자에게 전달하지 않기 위해 스케일을 기울이는 작은 요소가 있습니다.
- 함수를 호출하는 사람에게는 throw 될 수있는 예외에 대한 알림이 표시되지 않습니다. 어떤 종류의 예외를 찾고 있는지 아는 것은 약간의 예술 형식이됩니다 (블록 제외는 피해야합니다).
if val is None
보다 조금 쉽습니다except ComplicatedCustomExceptionThatHadToBeImportedFromSomeNameSpace
. 진지하게, 나는from django.core.exceptions import ObjectDoesNotExist
정말 일반적인 사용 사례를 처리하기 위해 모든 django 파일의 맨 위에 입력하는 것을 기억해야하는 것을 싫어 합니다. 정적으로 입력 된 세계에서 편집자가 대신 수행하도록하십시오.
하지만 솔직히 말하면 항상 판단을 내릴 수 있으며, 호출 된 함수가 도울 수없는 오류를받는 상황을 설명하는 것은 의미있는 예외를 다시 발생시키는 훌륭한 이유입니다. 정확한 아이디어가 있지만 예외가 아니라면 스택 추적에서 더 의미있는 정보를 제공 할 것입니다.
AttributeError: 'NoneType' object has no attribute 'foo'
10 개 중 9 번은 처리되지 않은 None을 반환하면 호출자가 보게 될 것입니다. 신경 쓰지 마세요.
(이 모든 종류의 cause
자바에서와 같이 기본적으로 파이썬 예외에 속성 이 있기를 바라며 ,이를 통해 예외를 새로운 예외에 전달할 수 있으므로 원하는 모든 것을 다시 던져 문제의 원래 원인을 잃지 않을 수 있습니다.)
일반적으로 복구 할 수없는 치명적인 문제가 발생하면 예외가 발생해야하며 (즉, 함수가 연결할 수없는 인터넷 리소스를 처리하는 경우) 함수가 실제로 무언가를 반환해야하는 경우 None을 반환해야합니다. 그러나 반환하기에 적절한 것은 없습니다 (예를 들어 함수가 문자열의 하위 문자열과 일치하려고하면 "None").
파이썬 3.5의 타이핑으로 :
None을 반환 할 때의 예제 함수는 다음과 같습니다.
def latestpdf(folder: str) -> Union[str, None]
예외를 발생시킬 때 :
def latestpdf(folder: str) -> str
옵션 2는 더 읽기 쉽고 비단 해 보입니다.
(앞서 언급 한대로 예외에 주석을 추가하는 + 옵션.)
참고 URL : https://stackoverflow.com/questions/1313812/raise-exception-vs-return-none-in-functions
'code' 카테고리의 다른 글
md5 해시 바이트 배열을 문자열로 변환 (0) | 2020.10.31 |
---|---|
SQL Server Management Studio에서 SSIS 패키지를 보려면 어떻게합니까? (0) | 2020.10.30 |
clang의 -Wweak-vtables의 의미는 무엇입니까? (0) | 2020.10.30 |
React Native에서 백그라운드 작업을 어떻게 실행할 수 있습니까? (0) | 2020.10.30 |
HTML5 Canvas 요소에서 사용자 정의 글꼴을 사용하려면 어떻게해야합니까? (0) | 2020.10.30 |