파이썬에서는 써드파티 패키지나 파이썬 표준 라이브러리를 포함한 많은 곳에서 예외를 사용한다.
사실 파이썬 언어 자체에도 예외가 들어있다. 예를 들어, for loop에서도 예외를 사용하고 있다.
for loops가 언제 멈출까?
예를 들어
words = ['exceptions', 'are', 'userful]
for word in words:
print(word)
이런 for loop 예제를 보자.
어떻게 마지막 엘리먼트 출력되고 나서 멈춰야한다는 걸 아는걸까? 바로 예외를 raise 하기 때문에 가능하다.
더 이상 반복할 엘리먼트가 없을 때, 내부적으로 StopIteration
예외나 IndexError
예외를 raise한다. 따라서 예외가 발생함으로써 언제 멈출지 알 수 있는 것이다.
결론적으로, 파이썬을 사용할 때 예외를 사용해도 될지 고민이 된다면, 파이썬에서는 우리는 이미 예외를 사용하고 있다는 점을 기억해두자.
EAFP = E
asier to A
sk for F
orgiveness than P
ermission (EAFP)
def get_log_level(config_dict):
if 'ENABLE_LOGGING' in config_dict:
if config_dict['ENABLE_LOGGIN'] != True:
return None
elif not 'DEFAULT_LOG_LEVEL' in config_dict:
return None
else:
return config_dict['DEFAULT_LOG_LEVEL']
else:
return None
print(get_log_level({}))
None
def get_log_level(config_dict):
try:
if config_dict['ENABLE_LOGGING']:
return config_dict['DEFAULT_LOG_LEVEL']
except KeyError:
return None
print(get_log_level({}))
None
except: 를 사용하는건 좋지 않고,
(except:
는 except BaseException:
와 동일한 기능을 한다.)
에러를 위한 로그를 남기고 더 이상 로직을 수행하면 안되는 경우라면 return 대신 raise를 사용해야한다.
def divide_zero():
try:
r = 1 / 0
return r
except:
print('except !')
return None
print(divide_zero())
None
def divide_zero():
try:
r = 1 / 0
return r
except:
# 로그 남기기
raise
print(divide_zero())
Traceback (most recent call last): File "tests/a.py", line 10, in <module> print(divide_zero()) File "tests/a.py", line 3, in divide_zero r = 1 / 0 ZeroDivisionError: division by zero