반환 값을 none으로 하고 특별한 의미를 부여할려고 함
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
0으로 나누는 경우 결과가 정해져 있지 않으므로 None을 반환하는게 타당해보임
그러나, 분모가 0이거나 빈 값을 대입할 때도 같은 None이 리턴됨
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
x, y # 빈값
result = careful_divide(x, y)
if not result:
print('Invalid inputs') # This runs! But shouldn't
>>
Invalid inputs
None 반환하면 실수할 가능성이 높아지므로 아래 두 가지 방법으로 실수를 줄일 수 있음
튜플의 첫 번째 부분은 연산이 성공/실패를 표시
두 번째 부분은 계산에 성공할 경우 실제 결과값 저장
def careful_divide(a, b):
try:
return True, a / b
except ZeroDivisionError:
return False, None
x, y = 5, 0 # 분모가 0
success, result = careful_divide(x, y)
if not success:
print('Invalid inputs')
>>
Invalid inputs
대신 Exception을 호출한 쪽으로 발생시켜서 호출자가 이를 처리하게 함
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('Invalid inputs')
x, y = 5, 2
try:
result = careful_divide(x, y)
except ValueError:
print('Invalid inputs')
else:
print('Result is %.1f' % result)
>>
Result is 2.5
2번 방법을 확장해서 타입 애너테이션을 사용하는 코드에도 적용할 수 있음
예를들어, 함수의 반환 값이 항상 float이라고 지정할 수 있고 그에 따라 none이 반환되지 않음을 알릴 수 있음
그러나 함수의 인터페이스에 예외가 포함되는지 표현하는 방법(검증오류)가 없으므로 개발자는 호출자가 어떤 exception을 잡아낼지, 발생시키는 예외를 문서에 명시해야함
def careful_divide(a: float, b: float) -> float:
"""Divides a by b.
Raises:
ValueError: When the inputs cannot be divided.
"""
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('Invalid inputs')
x, y = 5, 1
try:
result = careful_divide(x, y)
except ValueError:
print('Invalid inputs')
else:
print('Result is %.1f' % result)
>>
Result is 5.0