1.4 예외 #Writing Idiomatic Python 3.1

oen·2022년 1월 18일
0

1. 예외(Exceptions)를 사용하는 것을 두려워하지 말자

파이썬에서는 써드파티 패키지나 파이썬 표준 라이브러리를 포함한 많은 곳에서 예외를 사용한다.
사실 파이썬 언어 자체에도 예외가 들어있다. 예를 들어, for loop에서도 예외를 사용하고 있다.

for loops가 언제 멈출까?
예를 들어

words = ['exceptions', 'are', 'userful]

for word in words:
	print(word)

이런 for loop 예제를 보자.

어떻게 마지막 엘리먼트 출력되고 나서 멈춰야한다는 걸 아는걸까? 바로 예외를 raise 하기 때문에 가능하다.
더 이상 반복할 엘리먼트가 없을 때, 내부적으로 StopIteration 예외나 IndexError 예외를 raise한다. 따라서 예외가 발생함으로써 언제 멈출지 알 수 있는 것이다.

결론적으로, 파이썬을 사용할 때 예외를 사용해도 될지 고민이 된다면, 파이썬에서는 우리는 이미 예외를 사용하고 있다는 점을 기억해두자.

2. 'EAFP' 스타일로 코드를 작성하기 위해 예외를 사용하자

EAFP = Easier to Ask for Forgiveness than Permission (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

3. Bare Exception을 사용하지 말자

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
profile
🐾

0개의 댓글