파이썬은 실행 중 발생하는 오류와 예외를 관리하기 위해 핵심 기능을 제공합니다. 이 기능을 활용하면 코드 디버깅이 가능합니다.
예외 처리:
단언(Assertions)
파이썬 내장 예외 종류
| 예외 이름 | 설명 |
|---|---|
| BaseException | 모든 예외의 기본 클래스 |
| SystemExit | 인터프리터 종료 요청 |
| KeyboardInterrupt | 사용자 입력 중단(보통 ^C) |
| Exception | 일반적인 오류의 기본 클래스 |
| StopIteration | 반복자에 값이 없음 |
| GeneratorExit | 생성기 종료 알림 |
| StandardError | 내장 표준 예외의 기반 |
| ArithmeticError | 수치 계산 오류의 기반 |
| FloatingPointError | 부동소수점 계산 오류 |
| OverflowError | 숫자 연산 범위 초과 |
| ZeroDivisionError | 0으로 나누기(모든 데이터형) |
| AssertionError | 단언 실패 |
| AttributeError | 객체에 속성이 없음 |
| EOFError | 입력 끝(EOF) 도달 |
| EnvironmentError | 시스템 오류 기반 |
| IOError | 입력/출력 오류 |
| OSError | 시스템 오류 |
| WindowsError | 시스템 호출 실패 |
| ImportError | 모듈/객체 불러오기 실패 |
| LookupError | 잘못된 데이터 조회 기반 |
| IndexError | 시퀀스에 인덱스 없음 |
| KeyError | 매핑에 키 없음 |
| MemoryError | 메모리 초과 오류 |
| NameError | 선언되지 않은 객체 참조 |
| UnboundLocalError | 초기화되지 않은 로컬 변수 참조 |
| ReferenceError | 약한 참조가 GC된 객체 접근 |
| RuntimeError | 일반적인 실행 오류 |
| NotImplementedError | 구현되지 않은 메서드 |
| SyntaxError | 파이썬 문법 오류 |
| IndentationError | 들여쓰기 오류 |
| TabError | 탭과 공백 혼용 |
| SystemError | 인터프리터 시스템 오류 |
| TypeError | 잘못된 타입 연산 |
| ValueError | 잘못된 인수 전달 |
| UnicodeError | 유니코드 관련 오류 |
| UnicodeDecodeError | 유니코드 디코딩 오류 |
| UnicodeEncodeError | 유니코드 인코딩 오류 |
| UnicodeTranslateError | 유니코드 변환 오류 |
| Warning | 경고 기본 클래스 |
| DeprecationWarning | 폐지된 기능 경고 |
| FutureWarning | 미래 동작 변경 경고 |
| OverflowWarning | 오래된 자동 long 타입 경고 |
| PendingDeprecationWarning | 폐지 예정 기능 경고 |
| RuntimeWarning | 의심스러운 실행 행동 경고 |
| SyntaxWarning | 의심스러운 문법 경고 |
| UserWarning | 사용자 코드 생성 경고 |
1. 예외 정의
예외는 프로그램 실행 중 발생하는 이벤트로, 정상 실행 흐름에 영향을 줍니다.
파이썬이 코드를 처리할 수 없을 때 예외가 발생합니다.
예외는 오류를 나타내는 객체입니다.
예외를 처리하지 않으면 프로그램이 중단됩니다.
2. 예외 처리 구조
예외를 감지하고 처리하려면 try/except 구문을 사용합니다.
try/except 구문은 try 블록에서 발생한 오류를 감지하고, except 블록에서 예외를 처리합니다.
예외를 처리하지 않아도 프로그램이 종료되지 않도록 하려면 try 블록에서 예외를 캐치해야 합니다.
구문:
간단한 try....except...else 구조:
try:
<명령> # 다른 코드 실행
except <이름>:
<명령> # try 블록에서 '이름' 예외 발생 시
except <이름>, <데이터>:
<명령> # '이름' 예외 발생 시 추가 데이터 얻기
else:
<명령> # 예외 없이 실행 시
try 블록은 현재 프로그램 컨텍스트에 표시되며, 예외 발생 시 이 위치로 돌아옵니다. try 블록 실행 후 실행 흐름은 예외 발생 여부에 따라 달라집니다.
try 뒤의 명령 실행 중 예외 발생 시, 파이썬은 try로 돌아가 첫 번째 일치하는 except 블록을 실행합니다. 예외 처리 후 제어 흐름은 전체 try 구문을 통과합니다(예외 처리 중 새로운 예외 발생 시 제외).
try 뒤 명령 실행 중 예외 발생 시 일치하는 except 블록이 없으면, 상위 try로 예외가 전달되거나 프로그램 최상위에서 종료됩니다(기본 오류 메시지 출력).
try 블록 실행 중 예외 없을 경우, else 블록 실행 후 제어 흐름은 전체 try 구문을 통과합니다.
1. 여러 예외 유형 처리
동일한 except 블록으로 여러 예외 유형을 처리할 수 있습니다.
try:
정상 실행 코드
......................
except(Exception1[, Exception2[,...ExceptionN]]]):
위 예외 중 하나 발생 시 실행
......................
else:
예외 없을 시 실행
2. 모든 예외 유형 처리
try:
정상 실행 코드
......................
exceptException as e:
위 예외 중 하나 발생 시 실행
......................
else:
예외 없을 시 실행
3.try-finally 구문
try:
<명령>
finally:
<명령> # try 종료 시 항상 실행
raise
4. 예외 매개변수
예외는 매개변수를 가질 수 있으며, 이는 오류 메시지로 출력됩니다.
except 문을 통해 예외 매개변수를 캐치할 수 있습니다.
try:
정상 실행 코드
......................
except ExceptionType, Argument:
Argument 값 출력 가능...
예외 발생 시 변수는 예외 문장에 포함됩니다. 튜플 형태로 변수는 하나 이상의 값을 받을 수 있습니다.
튜플에는 오류 문자열, 숫자, 위치 등이 포함됩니다.
5. 예외 강제 발생
raise 문을 사용하여 직접 예외를 발생시킬 수 있습니다.
raise 구문 형식:
raise [Exception [, args [, traceback]]]
Exception은 예외 유형(예: NameError), args는 사용자가 제공하는 매개변수입니다. 마지막 매개변수는 선택적입니다(실제로 거의 사용되지 않음).
6. 사용자 정의 예외
새로운 예외 클래스를 생성하여 사용자 정의 예외를 만들 수 있습니다. 예외는 일반적으로 Exception 클래스를 상속합니다.
다음은 RuntimeError와 관련된 예제입니다. 이 예제에서는 RuntimeError를 기반으로 클래스를 생성하여 예외 발생 시 추가 정보를 출력합니다.
try 블록에서 사용자 정의 예외 발생 후 except 블록 실행 시, e 변수는 Networkerror 클래스 인스턴스를 생성합니다.
class CustomException(RuntimeError):
def __init__(self, arg):
self.args = arg
이 클래스를 정의한 후, 다음과 같이 예외를 발생시킬 수 있습니다:
try:
raise CustomException("Bad hostname")
except CustomException,e:
print e.args
특수 예외 처리 방법
단언(asser)
assert expression[,reason]
assert는 단언 키워드입니다. 이 문장을 실행할 때, 먼저 expression을 검증합니다. expression이 참이면 아무것도 하지 않지만, 거짓이면 예외를 발생시킵니다. reason은 이전에 언급한 예외 클래스 인스턴스와 동일합니다.
컨텍스트 관리(with 문)
try, except, finally 코드가 공유 리소스(파일, 데이터) 할당 및 해제를 보장하기 위해 사용될 때, with 문을 통해 try, except, finally에서 자유로울 수 있습니다! 구문은 다음과 같습니다:
with context_expr [as var]:
with_suite
예시: view plain
>>> with open('/root/test.py') as f:
... for line in f:
... print line
with 문을 사용하여 공유 리소스를 사용할 때, 특정 이유로 해제하지 않는 걱정이 필요 없습니다. 그러나 모든 객체가 with 문을 지원하는 것은 아닙니다. 다음은 지원하는 객체 목록입니다:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
sys 모듈을 통한 예외 정보 얻기
예외 정보를 얻는 또 다른 방법은 sys 모듈의 exc_info() 함수를 사용하는 것입니다. 이 함수는 (예외 클래스, 예외 클래스 인스턴스, 추적 객체)의 3요소 튜플을 반환합니다.
>>> try:
... 1/0
... except:
... import sys
... tuple = sys.exc_info()
...
>>> print tuple
(<type 'exceptions.ZeroDivisionError'>, ZeroDivisionError('integer division or modulo by zero',), <traceback object at 0x7f538a318b48>)
>>> for i in tuple:
... print i
...
<type 'exceptions.ZeroDivisionError'> #예외 클래스
integer division or modulo by zero #예외 클래스 인스턴스
<traceback object at 0x7f538a318b48> #추적 객체