파이썬에서 예외(Exception)를 출력하는 방법 정리
1. 문제 정의
파이썬 코드에서 try ... except 블록을 사용할 때, 발생한 예외의 내용을 화면에 출력하고 싶다면 어떻게 해야 할까요? 많은 초보자가 다음과 같이 작성하지만 실패합니다.
| |
위 코드는 NameError: name 'exception' is not defined 에러를 일으킵니다. exception이라는 이름은 정의되지 않았기 때문입니다. except: 뒤에 오는 변수명은 예외 객체를 자동으로 만들어주지 않습니다. 예외 객체를 사용하려면 반드시 as 구문으로 받아야 합니다.
이 문제는 StackOverflow에서 230만 회 이상 조회된 대표적인 파이썬 초보자 질문입니다. (출처: StackOverflow 1483429)
2. 원인 탐구
왜 이런 혼란이 생길까요? 두 가지 요인이 있습니다.
스택 트레이스(auto traceback)와 문자 메시지의 차이: 예외가 발생하면 파이썬 인터프리터가 기본적으로 전체 스택 트레이스를 출력합니다. 그래서 “그냥 출력되잖아” 라고 생각하기 쉽지만,
except블록 안에서는 인터프리터가 자동 출력을 하지 않으며 여러 예외를 처리하거나 로그를 남기려면 예외 객체를 직접 다뤄야 합니다.파이썬 버전별 문법 차이: 예외 객체를 받는 문법이 파이썬 버전에 따라 달라졌습니다.
- 파이썬 2.5 이하:
except Exception, e: - 파이썬 2.6 이상 및 파이썬 3.x:
except Exception as e: - 사람들이 구버전 코드를 복사하다 보면 현재 버전에서 동작하지 않는 문법을 쓰게 됩니다.
- 파이썬 2.5 이하:
비어 있는 except: 블록은 모든 예외를 잡지만 예외 객체에 접근할 방법이 없어서, 정작 무엇이 잘못되었는지 파악할 수 없게 됩니다.
3. 근본 원인 분석
| 오해 | 실제 |
|---|---|
except: 만으로 예외 내용을 알 수 있다 | 아니다. except: 만으로는 예외 객체에 접근할 수 없다 |
print(exception) 변수가 자동 생성된다 | 아니다. 예외 객체를 받지 않으면 존재하지 않는 이름이다 |
| 예외 출력 방법은 하나뿐이다 | print(e), traceback, logging 등 목적에 따라 선택해야 한다 |
근본 원인은 예외 객체를 as 구문으로 변수에 받아 들이지 않았기 때문입니다. except 절은 조건을 지정할 뿐, 그 자체로는 내용을 담지 않습니다. 예외의 정보를 활용하려면 반드시 except Exception as e: 형태로 예외 객체(여기서는 e)를 명시적으로 받아야 합니다.
4. 코드 해결책
4-1. 기초: 예외 메시지만 출력 (파이썬 3.x, 2.6+)
| |
print(e)는 예외의 설명 문자열만 출력합니다. 간단한 확인 용도로 충분합니다.
4-2. 예외 타입까지 함께 출력
| |
4-3. 완전한 스택 트레이스 출력 (traceback 모듈)
print(e)는 메시지만 보여주므로 파일·줄 번호 등 위치 정보가 필요할 때는 traceback 모듈을 사용합니다.
| |
문자열로 얻어 로그·파일에 저장하려면 traceback.format_exc()를 사용합니다.
| |
4-4. 로깅 시스템 활용 (권장)
운영 환경에서는 print 대신 logging 모듈에 예외를 남기는 것이 좋습니다. logger.exception()는 자동으로 스택 트레이스를 포함해 출력합니다.
| |
4-5. 파이썬 2.5 이하 구버전 대응
매우 오래된 파이썬 2.5 이하 환경에서만 유효합니다.
| |
⚠️ 현대 파이썬(3.x)에서는 이 문법이 동작하지 않습니다. 반드시
except Exception as e:를 사용하세요.
방법 비교 요약
| 방법 | 출력 내용 | 사용 상황 |
|---|---|---|
print(e) | 예외 메시지만 | 간단한 확인, 임시 디버깅 |
type(e).__name__ + e | 예외 타입 + 메시지 | 원인 유형 파악이 필요할 때 |
traceback.print_exc() | 전체 스택 트레이스 | 위치·호출 경로 확인이 필요할 때 |
logging.exception() | 스택 트레이스 + 로그 | 운영 환경, 파일/로그에 기록할 때 |
5. 향후 예방 조치
- 빈
except:대신except Exception as e:사용: 예외 객체를 받아야 내용을 알 수 있습니다. (단, 모든 예외를 무조건 삼키는 빈except:는 오류를 숨길 수 있으므로 피하세요.) - 목적에 맞는 출력 선택: 간단 확인은
print(e), 상세 진단은traceback, 운영 기록은logging.exception()을 사용합니다. - 스택 트레이스가 필요하면 traceback 모듈 사용:
traceback.format_exc()로 문자열을 얻으면 파일 저장이나 API 호출에 재사용할 수 있습니다. - 예외를 삼키지 않기: 예외를 출력 후
pass로 끝내면 문제를 숨기게 됩니다. 최소한 로그로 남기세요. - 버전 문법 확인: 파이썬 3.x에서는 반드시
as구문(except Exception as e:)을 사용합니다.
출처
- StackOverflow: How do I print an exception in Python? (질문 ID 1483429)