반응형
Python에서 예외 처리를 처리하는 방식에는 일반적으로 try-except 블록을 사용하며, 간단한 경우에는 contextlib.suppress를 사용할 수 있습니다. 이 두 가지 방식의 비교와 장단점을 정리해 보겠습니다.
1. try-except 블록
일반적인 예외 처리 방식
try:
result = 10 / 0 # 예외 발생
except ZeroDivisionError:
result = None
- 동작:
- 코드에서 특정 예외가 발생했을 때, 이를 잡아내어 처리합니다.
- 예외를 세부적으로 처리하거나, 여러 예외를 한 번에 처리할 수 있습니다.
- 장점:
- 세부적인 예외 처리 가능: 예외 유형별로 분리하여 다르게 처리할 수 있습니다.
- 커스텀 로직: 예외 발생 시 추가적인 로직을 구현할 수 있습니다.
- 가독성: 복잡한 예외 처리를 명확히 표현할 수 있습니다.
- 단점:
- 코드 길이가 길어질 수 있음: 예외가 많아지면 except 블록이 많아져 가독성이 떨어질 수 있습니다.
- 단순한 경우에도 다소 과한 구조일 수 있음.
2. contextlib.suppress 사용
간단한 예외 처리 방식
from contextlib import suppress
with suppress(ZeroDivisionError):
result = 10 / 0 # 예외 발생, 무시됨
- 동작:
- with 블록 내에서 특정 예외가 발생하면 이를 자동으로 무시합니다.
- 예외를 무시하고 나머지 코드 실행을 이어갑니다.
- 장점:
- 간결함: 코드가 매우 단순하고 짧습니다.
- 특정 예외를 무시하기 좋음: "아무 작업도 필요 없는" 경우 유용합니다.
- 가독성: 불필요한 try-except 블록을 줄여 코드가 깔끔합니다.
- 단점:
- 범용성 제한: 한 번에 하나의 예외만 처리 가능.
- 로직 포함 불가: 예외가 발생했을 때 추가적인 작업을 수행할 수 없습니다.
- 디버깅 어려움: 예외가 무조건 무시되므로 문제를 추적하기 어려울 수 있습니다.
3. 비교
항목 try-except contextlib.suppress
주요 목적 | 예외 처리 및 복잡한 로직 처리 | 단순히 특정 예외를 무시 |
코드 길이 | 상대적으로 길어질 수 있음 | 매우 간결 |
가독성 | 복잡한 로직에서 더 명확 | 단순 예외 무시에서 더 좋음 |
예외 세분화 | 여러 예외 처리 가능 | 하나의 예외만 처리 가능 |
후속 작업 | 추가 로직 구현 가능 | 불가능 |
사용 사례 | 예외에 따른 대응이 필요할 때 | 예외를 무시하고 넘어갈 때 |
4. 사용 사례
try-except 사용:
- 예외 유형별로 다르게 처리하거나, 디버깅 정보를 추가해야 할 때.
- 예외 발생 시 로깅, 리트라이, 혹은 다른 작업을 수행해야 할 때.
try:
value = int(input("숫자를 입력하세요: "))
except ValueError:
print("유효하지 않은 입력입니다.")
except KeyboardInterrupt:
print("사용자가 입력을 중단했습니다.")
contextlib.suppress 사용:
- 단순히 특정 예외를 무시하고 코드를 이어가고 싶을 때.
- 파일이 없으면 무시하고 넘어가는 경우:
from contextlib import suppress
with suppress(FileNotFoundError):
with open("non_existent_file.txt") as f:
content = f.read()
결론
- **try-except**은 더 강력하고 세부적인 예외 처리를 가능하게 하지만, 코드가 길어질 수 있습니다.
- **contextlib.suppress**는 간단한 예외를 무시하고 싶을 때 더 깔끔하고 효율적입니다.
따라서, 상황에 따라 적절한 방식을 선택하는 것이 중요합니다.
반응형
'Language > Python' 카테고리의 다른 글
Python 정적 코드 분석 도구: MyPy와 PyType 비교 (0) | 2024.12.05 |
---|---|
setdefault vs defaultdict (1) | 2024.11.30 |
Json Schema를 사용한 Json 유효성 검사하기 (0) | 2024.04.06 |
[numpy] r_, c_ 함수에 대하여 (0) | 2023.12.02 |
[Python] Sliding Window (0) | 2023.08.24 |