python
Python이 문제를 알리는 방식, 문법 에러와 런타임 에러의 차이, 내장 예외를 자신 있게 다루는 법을 알아봅니다.
Python 프로그램을 실행할 때 인터프리터는 처리되지 않은 에러를 만나면 즉시 실행을 멈춥니다. 이 에러는 크게 두 범주로 나뉩니다:
문법 에러는 소스 코드가 Python의 문법 규칙을 위반할 때 발생. 인터프리터는 에러 메시지에서 캐럿(^)으로 정확한 위치를 가리킵니다.
> >>> if a < 3
File "<interactive input>", line 1
if a < 3
^
SyntaxError: invalid syntax
이 예에서 if 문 뒤에 콜론(:)이 빠져 SyntaxError 발생.
논리 에러, 즉 예외는 코드가 문법 검사를 통과한 후에만 드러납니다. 흔한 예:
ZeroDivisionError)FileNotFoundError)ImportError)예외 발생 시 Python은 예외 객체 생성. 처리되지 않으면 트레이스백이 출력되며 호출 스택과 실패 원인 표시.
> >>> 1 / 0
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
ZeroDivisionError: division by zero
> >>> open("imaginary.txt")
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'imaginary.txt'
Python 인터프리터는 다양한 실패 조건을 알리는 수많은 내장 예외를 발생시킵니다. 다음 스니펫으로 나열 가능:
print(dir(locals()['__builtins__']))
자주 마주치는 내장 예외와 발생 상황 간단 참조:
| 예외 | 발생 원인 |
|---|---|
AssertionError | assert 문 실패 시 |
AttributeError | 속성 할당/참조 실패 시 |
EOFError | input()이 EOF 조건 만날 때 |
FloatingPointError | 부동소수점 연산 실패 시 |
GeneratorExit | 제너레이터의 close() 호출 시 |
ImportError | 임포트 모듈 못 찾을 때 |
IndexError | 시퀀스 인덱스 범위 초과 시 |
KeyError | 딕셔너리에 키 없을 때 |
KeyboardInterrupt | 사용자가 Ctrl+C 또는 Delete 누를 때 |
MemoryError | 연산이 가용 메모리 초과 시 |
NameError | 변수가 로컬/전역 스코프에 없을 때 |
NotImplementedError | 구현 없는 추상 메서드 호출 시 |
OSError | 시스템 관련 에러(파일 I/O 등) |
OverflowError | 산술 결과가 너무 커 표현 불가 시 |
ReferenceError | 약한 참조가 가비지 컬렉션된 객체 프록시 시 |
RuntimeError | 다른 카테고리에 맞지 않는 에러 |
StopIteration | next() 호출 시 이터레이터 소진 |
SyntaxError | 파서가 잘못된 문법 만날 때 |
IndentationError | 들여쓰기 잘못됐을 때 |
TabError | 들여쓰기에 탭과 스페이스 혼용 시 |
SystemError | 인터프리터 내부 에러 감지 시 |
SystemExit | sys.exit() 호출 시 |
TypeError | 부적절한 타입 객체로 연산/함수 호출 시 |
UnboundLocalError | 할당 전 지역 변수 참조 시 |
UnicodeError | 유니코드 인코딩/디코딩 에러 |
UnicodeEncodeError | 유니코드 인코딩 에러 시 |
UnicodeDecodeError | 유니코드 디코딩 에러 시 |
UnicodeTranslateError | 유니코드 번역 에러 시 |
ValueError | 함수가 올바른 타입이나 부적절한 값 인수 받을 때 |
ZeroDivisionError | 0으로 나누거나 모듈로 연산 시 |
더 세밀한 제어가 필요하면 사용자 정의 예외 클래스 정의 가능. Python 사용자 정의 예외 참조.
예외 처리는 try, except, finally 블록으로 직관적. 더 깊게는 Python try, except, finally 문 참조.
python
파이썬 2란 무엇인가? 파이썬 2는 파이썬 개선 제안(PEP)에 명시된 기술적 세부사항을 해결하며 개발을 간소화했습니다. 최종 릴리스인 파이썬 2.7은 2020년에 수명 종료(EOL)를 맞이했으며, 파이썬 소프트웨어 재단에서 더 이상 지원하지 않습니다. 여전히 레거시 시스템에서 사용되지만 미래는 불확실합니다. 기존 코드베이스에 대한 레거시 지원 Puppet, Ansible 등 구형 라이브러리 및 도구와의 호환성 아직 파이썬 3로 마이그레이션할 수 없는 조직 파이썬 3란 무엇인가? 2008년 12월 출시된 파이썬 3는
많은 사람이 예외를 잘못 처리하는 거 봅니다. 혹시 당신도 해당될 수 있습니다. 다음 상황 익숙합니까? 코드 작성 중인데, 사용하는 라이브러리가 예외 발생시킬 수 있음. 정확히 어떤 예외인지 기억 안 남. 이 지점에서 소위 잡아먹기(catch-all) 블록 써서 재밌는 부분으로 넘어가기 유혹적. 목차 최악의 방법 모든 예외 잡는 약간 나은 방법 더 나빠지는 경우 다룰 수 있는 것만 잡기 결론 최악의 방법 할 수 있는 최악은 뭐든 잡는 try-except 블록 만드는 것. 잡아먹기라 함은 이런 거: try: .