파이썬으로 작업하다 보면 try~except를 자주 사용하게 된다. 에러가 발생하더라도 전체 작업이 중단되지 않게 하기 위해서인데, 문제는 이걸 여기저기 덕지덕지 사용하다 보니 나중에 디버깅을 할 때 도대체 어디서 문제가 생겼는지 한 번에 파악하기가 어려워졌다는 점이었다.
이 글에서는 내가 실제로 겪었던 방식들을 기준으로, 디버깅 과정에 조금이나마 도움이 되었던 예외 처리 방법을 정리해봤다.
try~except + print(e)
에러가 발생해도 코드는 계속 동작하게 두고, 어떤 에러가 발생했는지만 로그로 남기는 방법이다.
def convert_to_int(value):
try:
return int(value)
except ValueError as e:
print(e)
return None
# 출력 예시
invalid literal for int() with base 10: 'abc'
# 함수 정상 종료
장점
- 코드 흐름이 끊기지 않는다.
- 콘솔 로그를 통해 에러 원인을 바로 확인할 수 있다
단점
- 함수 실패 여부를 놓치지 쉽다. (함수 정상 리턴)
try~except + raise, from e
전체 흐름에 치명적인 문제가 발생할 여지가 있는 경우 예외를 발생시켜 실패시키는 방법이다.
def convert_to_int(value):
try:
return int(value)
except ValueError as e:
raise RuntimeError("숫자 변환 실패") from e
# 출력 예시 - from e 미사용
Traceback (most recent call last):
File "example.py", line 12, in <module>
convert_to_int("abc")
File "example.py", line 8, in convert_to_int
raise RuntimeError("숫자 변환 실패")
RuntimeError: 숫자 변환 실패
# 출력 예시 - from e 사용
Traceback (most recent call last):
File "example.py", line 6, in convert_to_int
int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "example.py", line 12, in <module>
convert_to_int("abc")
File "example.py", line 8, in convert_to_int
raise RuntimeError("숫자 변환 실패") from e
RuntimeError: 숫자 변환 실패
장점
- 해당 지점에서 코드 흐름이 명확하게 중단되고
- 호출한 쪽에서도 “이건 실패한 작업이다”라는 걸 바로 알 수 있다.
- from e 덕분에 실제 원인이 된 에러(ValueError)도 함께 남는다.
단점
- 우선 코드가 완전히 끝나야 하는 경우에는 적합하지 않다.